12 #ifndef hifi_OctreeElement_h
13 #define hifi_OctreeElement_h
16 #define SIMPLE_EXTERNAL_CHILDREN
20 #include <QReadWriteLock>
22 #include <OctalCode.h>
23 #include <SharedUtil.h>
24 #include <ViewFrustum.h>
27 #include "OctreeConstants.h"
29 using AtomicUIntStat = std::atomic<uintmax_t>;
32 class EncodeBitstreamParams;
36 class ReadBitstreamToTreeParams;
40 using OctreeElementPointer = std::shared_ptr<OctreeElement>;
41 using OctreeElementWeakPointer = std::weak_ptr<OctreeElement>;
42 using ConstOctreeElementPointer = std::shared_ptr<const OctreeElement>;
43 using OctreePointer = std::shared_ptr<Octree>;
45 class OctreeElement:
public std::enable_shared_from_this<OctreeElement> {
51 virtual OctreeElementPointer createNewElement(
unsigned char * octalCode = NULL) = 0;
54 virtual void init(
unsigned char * octalCode);
55 virtual ~OctreeElement();
60 virtual OctreeElementPointer addChildAtIndex(
int childIndex);
63 virtual void calculateAverageFromChildren() { }
66 virtual bool collapseChildren() {
return false; }
70 virtual bool hasContent()
const {
return isLeaf(); }
74 virtual bool hasDetailedContent()
const {
return isLeaf(); }
79 virtual void splitChildren() { }
82 virtual bool requiresSplit()
const {
return false; }
85 typedef enum { COMPLETED, PARTIAL, NONE } AppendState;
87 virtual void debugExtraEncodeData(EncodeBitstreamParams& params)
const { }
91 virtual int readElementDataFromBuffer(
const unsigned char* data,
int bytesLeftToRead, ReadBitstreamToTreeParams& args)
98 virtual bool isRendered()
const {
return getShouldRender(); }
100 virtual bool deleteApproved()
const {
return true; }
102 virtual bool canPickIntersect()
const {
return isLeaf(); }
107 virtual bool findSpherePenetration(
const glm::vec3& center,
float radius,
108 glm::vec3& penetration,
void** penetratedObject)
const;
111 const unsigned char* getOctalCode()
const {
return (_octcodePointer) ? _octalCode.pointer : &_octalCode.buffer[0]; }
112 OctreeElementPointer getChildAtIndex(
int childIndex)
const;
113 void deleteChildAtIndex(
int childIndex);
114 OctreeElementPointer removeChildAtIndex(
int childIndex);
115 bool isParentOf(
const OctreeElementPointer& possibleChild)
const;
118 bool safeDeepDeleteChildAtIndex(
int childIndex,
int recursionCount = 0);
121 const AACube& getAACube()
const {
return _cube; }
122 const glm::vec3& getCorner()
const {
return _cube.getCorner(); }
123 float getScale()
const {
return _cube.getScale(); }
124 int getLevel()
const {
return numberOfThreeBitSectionsInCode(getOctalCode()) + 1; }
126 float getEnclosingRadius()
const;
127 bool isInView(
const ViewFrustum& viewFrustum)
const {
return computeViewIntersection(viewFrustum) != ViewFrustum::OUTSIDE; }
128 ViewFrustum::intersection computeViewIntersection(
const ViewFrustum& viewFrustum)
const;
129 float distanceToCamera(
const ViewFrustum& viewFrustum)
const;
130 float furthestDistanceToCamera(
const ViewFrustum& viewFrustum)
const;
133 float distanceSquareToPoint(
const glm::vec3& point)
const;
134 float distanceToPoint(
const glm::vec3& point)
const;
136 bool isLeaf()
const {
return _childBitmask == 0; }
137 int getChildCount()
const {
return numberOfOnes(_childBitmask); }
138 void printDebugDetails(
const char* label)
const;
139 bool isDirty()
const {
return _isDirty; }
140 void clearDirtyBit() { _isDirty =
false; }
141 void setDirtyBit() { _isDirty =
true; }
142 bool hasChangedSince(quint64 time)
const {
return (_lastChanged > time); }
143 void markWithChangedTime();
144 quint64 getLastChanged()
const {
return _lastChanged; }
145 void handleSubtreeChanged(OctreePointer myTree);
148 void setShouldRender(
bool shouldRender);
149 bool getShouldRender()
const {
return _shouldRender; }
152 void setSourceUUID(
const QUuid& sourceID);
153 QUuid getSourceUUID()
const;
154 uint16_t getSourceUUIDKey()
const {
return _sourceUUIDKey; }
155 bool matchesSourceUUID(
const QUuid& sourceUUID)
const;
156 static uint16_t getSourceNodeUUIDKey(
const QUuid& sourceUUID);
158 static void resetPopulationStatistics();
159 static unsigned long getNodeCount() {
return _voxelNodeCount; }
160 static unsigned long getInternalNodeCount() {
return _voxelNodeCount - _voxelNodeLeafCount; }
161 static unsigned long getLeafNodeCount() {
return _voxelNodeLeafCount; }
163 static quint64 getOctreeMemoryUsage() {
return _octreeMemoryUsage; }
164 static quint64 getOctcodeMemoryUsage() {
return _octcodeMemoryUsage; }
165 static quint64 getExternalChildrenMemoryUsage() {
return _externalChildrenMemoryUsage; }
166 static quint64 getTotalMemoryUsage() {
return _octreeMemoryUsage + _octcodeMemoryUsage + _externalChildrenMemoryUsage; }
168 static quint64 getGetChildAtIndexTime() {
return _getChildAtIndexTime; }
169 static quint64 getGetChildAtIndexCalls() {
return _getChildAtIndexCalls; }
170 static quint64 getSetChildAtIndexTime() {
return _setChildAtIndexTime; }
171 static quint64 getSetChildAtIndexCalls() {
return _setChildAtIndexCalls; }
173 static quint64 getExternalChildrenCount() {
return _externalChildrenCount; }
174 static quint64 getChildrenCount(
int childCount) {
return _childrenCount[childCount]; }
177 CHILD_BOTTOM_RIGHT_NEAR = 0,
178 CHILD_BOTTOM_RIGHT_FAR = 1,
179 CHILD_TOP_RIGHT_NEAR = 2,
180 CHILD_TOP_RIGHT_FAR = 3,
181 CHILD_BOTTOM_LEFT_NEAR = 4,
182 CHILD_BOTTOM_LEFT_FAR = 5,
183 CHILD_TOP_LEFT_NEAR = 6,
184 CHILD_TOP_LEFT_FAR = 7,
202 OctreeElementPointer getOrCreateChildElementAt(
float x,
float y,
float z,
float s);
203 OctreeElementPointer getOrCreateChildElementContaining(
const AACube& box);
204 OctreeElementPointer getOrCreateChildElementContaining(
const AABox& box);
205 int getMyChildContaining(
const AACube& cube)
const;
206 int getMyChildContaining(
const AABox& box)
const;
207 int getMyChildContainingPoint(
const glm::vec3& point)
const;
209 void bumpChangedContent() { _lastChangedContent = usecTimestampNow(); }
210 uint64_t getLastChangedContent()
const {
return _lastChangedContent; }
214 void deleteAllChildren();
215 void setChildAtIndex(
int childIndex,
const OctreeElementPointer& child);
217 void calculateAACube();
223 unsigned char buffer[8];
224 unsigned char* pointer;
227 quint64 _lastChanged;
228 uint64_t _lastChangedContent { 0 };
231 #ifdef SIMPLE_CHILD_ARRAY
232 OctreeElementPointer _simpleChildArray[8];
235 #ifdef SIMPLE_EXTERNAL_CHILDREN
237 OctreeElementPointer _childrenSingle;
238 OctreeElementPointer _externalChildren[NUMBER_OF_CHILDREN];
242 uint16_t _sourceUUIDKey;
247 static uint16_t _nextUUIDKey;
248 static std::map<QString, uint16_t> _mapSourceUUIDsToKeys;
249 static std::map<uint16_t, QString> _mapKeysToSourceUUIDs;
251 unsigned char _childBitmask;
253 bool _falseColored : 1,
257 _unknownBufferIndex : 1,
258 _childrenExternal : 1;
260 static AtomicUIntStat _voxelNodeCount;
261 static AtomicUIntStat _voxelNodeLeafCount;
263 static AtomicUIntStat _octreeMemoryUsage;
264 static AtomicUIntStat _octcodeMemoryUsage;
265 static AtomicUIntStat _externalChildrenMemoryUsage;
267 static AtomicUIntStat _getChildAtIndexTime;
268 static AtomicUIntStat _getChildAtIndexCalls;
269 static AtomicUIntStat _setChildAtIndexTime;
270 static AtomicUIntStat _setChildAtIndexCalls;
272 static AtomicUIntStat _externalChildrenCount;
273 static AtomicUIntStat _childrenCount[NUMBER_OF_CHILDREN + 1];
Handles packing of the data portion of PacketType_OCTREE_DATA messages.
Definition: OctreePacketData.h:93
Client and server, axis aligned box for bounds of this voxel, 48 bytes.
Definition: OctreeElement.h:222