12 #ifndef hifi_DiffTraversal_h
13 #define hifi_DiffTraversal_h
15 #include <shared/ConicalViewFrustum.h>
17 #include "EntityTreeElement.h"
24 class VisibleElement {
26 EntityTreeElementPointer element;
32 bool usesViewFrustums()
const;
33 bool isVerySimilar(
const View& view)
const;
35 bool shouldTraverseElement(
const EntityTreeElement& element)
const;
36 float computePriority(
const EntityItemPointer& entity)
const;
38 ConicalViewFrustums viewFrustums;
39 uint64_t startTime { 0 };
40 float lodScaleFactor { 1.0f };
46 Waypoint(EntityTreeElementPointer& element);
48 void getNextVisibleElementFirstTime(VisibleElement& next,
const View& view);
49 void getNextVisibleElementRepeat(VisibleElement& next,
const View& view, uint64_t lastTime);
50 void getNextVisibleElementDifferential(VisibleElement& next,
const View& view,
const View& lastView);
52 int8_t getNextIndex()
const {
return _nextIndex; }
53 void initRootNextIndex() { _nextIndex = -1; }
56 EntityTreeElementWeakPointer _weakElement;
60 typedef enum { First, Repeat, Differential } Type;
64 Type prepareNewTraversal(
const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass =
false);
66 const View& getCurrentView()
const {
return _currentView; }
68 uint64_t getStartOfCompletedTraversal()
const {
return _completedView.startTime; }
69 bool finished()
const {
return _path.empty(); }
71 void setScanCallback(std::function<
void (VisibleElement&)> cb);
72 void traverse(uint64_t timeBudget);
74 void reset() { _path.clear(); _completedView.startTime = 0; }
77 void getNextVisibleElement(VisibleElement& next);
81 std::vector<Waypoint> _path;
82 std::function<void (VisibleElement&)> _getNextVisibleElementCallback {
nullptr };
83 std::function<void (VisibleElement&)> _scanElementCallback { [](VisibleElement& e){} };