Overte C++ Documentation
EntityTreeSendThread.h
1 //
2 // EntityTreeSendThread.h
3 // assignment-client/src/entities
4 //
5 // Created by Stephen Birarda on 2/15/17.
6 // Copyright 2017 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_EntityTreeSendThread_h
13 #define hifi_EntityTreeSendThread_h
14 
15 #include <unordered_set>
16 
17 #include "../octree/OctreeSendThread.h"
18 
19 #include <DiffTraversal.h>
20 #include <EntityPriorityQueue.h>
21 #include <shared/ConicalViewFrustum.h>
22 
23 
24 class EntityNodeData;
25 class EntityItem;
26 
27 class EntityTreeSendThread : public OctreeSendThread {
28  Q_OBJECT
29 
30 public:
31  EntityTreeSendThread(OctreeServer* myServer, const SharedNodePointer& node);
32 
33 protected:
34  bool traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
35  bool viewFrustumChanged, bool isFullScene) override;
36 
37 private slots:
38  void resetState(); // clears our known state forcing entities to appear unsent
39 
40 private:
41  // the following two methods return booleans to indicate if any extra flagged entities were new additions to set
42  bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
43  bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
44 
45  void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root, bool forceFirstPass = false);
46  bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override;
47 
48  void preDistributionProcessing() override;
49  bool hasSomethingToSend(OctreeQueryNode* nodeData) override { return !_sendQueue.empty(); }
50  bool shouldStartNewTraversal(OctreeQueryNode* nodeData, bool viewFrustumChanged) override { return viewFrustumChanged || _traversal.finished(); }
51 
52  DiffTraversal _traversal;
53  EntityPriorityQueue _sendQueue;
54  std::unordered_map<EntityItem*, uint64_t> _knownState;
55 
56  // packet construction stuff
57  EntityTreeElementExtraEncodeDataPointer _extraEncodeData { new EntityTreeElementExtraEncodeData() };
58  int32_t _numEntitiesOffset { 0 };
59  uint16_t _numEntities { 0 };
60 
61 private slots:
62  void editingEntityPointer(const EntityItemPointer& entity);
63  void deletingEntityPointer(EntityItem* entity);
64 };
65 
66 #endif // hifi_EntityTreeSendThread_h
Definition: EntityItem.h:82
Threaded processor for sending octree packets to a single client.
Definition: OctreeSendThread.h:30
Handles assignments of type OctreeServer - sending octrees to various clients.
Definition: OctreeServer.h:38