13 #ifndef hifi_render_Scene_h
14 #define hifi_render_Scene_h
17 #include "SpatialTree.h"
19 #include "Selection.h"
20 #include "Transition.h"
21 #include "HighlightStyle.h"
43 typedef std::function<void(ItemID,
const Transition*)> TransitionQueryFunc;
44 typedef std::function<void()> TransitionFinishedFunc;
45 typedef std::function<void(HighlightStyle
const*)> SelectionHighlightQueryFunc;
51 void resetItem(ItemID
id,
const PayloadPointer& payload);
52 void removeItem(ItemID
id);
53 bool hasRemovedItems()
const {
return !_removedItems.empty(); }
54 template <
class T>
void updateItem(ItemID
id, std::function<
void(T&)> func) {
55 updateItem(
id, std::make_shared<UpdateFunctor<T>>(func));
57 void updateItem(ItemID
id,
const UpdateFunctorPointer& functor);
58 void updateItem(ItemID
id) { updateItem(
id,
nullptr); }
61 void resetTransitionOnItem(ItemID
id, Transition::Type transition, ItemID boundId = render::Item::INVALID_ITEM_ID);
62 void removeTransitionFromItem(ItemID
id);
63 void setTransitionFinishedOperator(ItemID
id, TransitionFinishedFunc func);
64 void queryTransitionOnItem(ItemID
id, TransitionQueryFunc func);
67 void resetSelection(
const Selection& selection);
69 void resetSelectionHighlight(
const std::string& selectionName,
const HighlightStyle& style = HighlightStyle());
70 void removeHighlightFromSelection(
const std::string& selectionName);
71 void querySelectionHighlight(
const std::string& selectionName,
const SelectionHighlightQueryFunc& func);
73 void reserve(
const std::vector<Transaction>& transactionContainer);
74 void merge(
const std::vector<Transaction>& transactionContainer);
75 void merge(std::vector<Transaction>&& transactionContainer);
76 void merge(
const Transaction& transaction);
77 void merge(Transaction&& transaction);
82 using Reset = std::tuple<ItemID, PayloadPointer>;
83 using Remove = ItemID;
84 using Update = std::tuple<ItemID, UpdateFunctorPointer>;
86 using TransitionReset = std::tuple<ItemID, Transition::Type, ItemID>;
87 using TransitionRemove = ItemID;
88 using TransitionFinishedOperator = std::tuple<ItemID, TransitionFinishedFunc>;
89 using TransitionQuery = std::tuple<ItemID, TransitionQueryFunc>;
91 using SelectionReset = Selection;
93 using HighlightReset = std::tuple<std::string, HighlightStyle>;
94 using HighlightRemove = std::string;
95 using HighlightQuery = std::tuple<std::string, SelectionHighlightQueryFunc>;
97 using Resets = std::vector<Reset>;
98 using Removes = std::vector<Remove>;
99 using Updates = std::vector<Update>;
101 using TransitionResets = std::vector<TransitionReset>;
102 using TransitionRemoves = std::vector<TransitionRemove>;
103 using TransitionFinishedOperators = std::vector<TransitionFinishedOperator>;
104 using TransitionQueries = std::vector<TransitionQuery>;
106 using SelectionResets = std::vector<SelectionReset>;
108 using HighlightResets = std::vector<HighlightReset>;
109 using HighlightRemoves = std::vector<HighlightRemove>;
110 using HighlightQueries = std::vector<HighlightQuery>;
113 Removes _removedItems;
114 Updates _updatedItems;
116 TransitionResets _resetTransitions;
117 TransitionRemoves _removeTransitions;
118 TransitionFinishedOperators _transitionFinishedOperators;
119 TransitionQueries _queriedTransitions;
121 SelectionResets _resetSelections;
123 HighlightResets _highlightResets;
124 HighlightRemoves _highlightRemoves;
125 HighlightQueries _highlightQueries;
127 typedef std::vector<Transaction> TransactionQueue;
138 Scene(glm::vec3 origin,
float size);
145 bool isAllocatedID(
const ItemID&
id)
const;
148 size_t getNumItems()
const {
return _numAllocatedItems.load(); }
151 void enqueueTransaction(
const Transaction& transaction);
154 void enqueueTransaction(Transaction&& transaction);
157 uint32_t enqueueFrame();
160 void processTransactionQueue();
164 Selection getSelection(
const Selection::Name& name)
const;
168 bool isSelectionEmpty(
const Selection::Name& name)
const;
172 void addItemToSelection(
const std::string& selectionName, ItemID itemID);
176 void removeSelection(
const std::string& selectionName);
182 const Item& getItem(
const ItemID&
id)
const {
return _items[id]; }
185 const Item getItemSafe(
const ItemID&
id)
const {
if (isAllocatedID(
id)) {
return _items[id]; }
else {
return Item(); } }
188 const ItemSpatialTree& getSpatialTree()
const {
return _masterSpatialTree; }
191 const ItemIDSet& getNonspatialSet()
const {
return _masterNonspatialSet; }
195 StagePointer getStage(
const Stage::Name& name)
const;
197 std::shared_ptr<T> getStage(
const Stage::Name& name = T::getName())
const {
198 auto stage = getStage(name);
199 return (stage ? std::static_pointer_cast<T>(stage) : std::shared_ptr<T>());
201 void resetStage(
const Stage::Name& name,
const StagePointer& stage);
203 void setItemTransition(ItemID
id, Index transitionId);
204 void removeItemTransition(ItemID
id);
206 HighlightStyle getOutlineStyle(ItemID
id,
const ViewFrustum& viewFrustum, uint16_t height) {
return _items[id].getOutlineStyle(viewFrustum, height); }
211 std::atomic<unsigned int> _IDAllocator{ 1 };
212 std::atomic<unsigned int> _numAllocatedItems{ 1 };
213 std::mutex _transactionQueueMutex;
214 TransactionQueue _transactionQueue;
217 std::mutex _transactionFramesMutex;
218 using TransactionFrames = std::vector<Transaction>;
219 TransactionFrames _transactionFrames;
220 uint32_t _transactionFrameNumber{ 0 };
223 void processTransactionFrame(
const Transaction& transaction);
227 std::mutex _itemsMutex;
229 ItemSpatialTree _masterSpatialTree;
230 ItemIDSet _masterNonspatialSet;
232 void resetItems(
const Transaction::Resets& transactions);
233 void resetTransitionFinishedOperator(
const Transaction::TransitionFinishedOperators& transactions);
234 void removeItems(
const Transaction::Removes& transactions);
235 void updateItems(
const Transaction::Updates& transactions);
237 void resetTransitionItems(
const Transaction::TransitionResets& transactions);
238 void removeTransitionItems(
const Transaction::TransitionRemoves& transactions);
239 void queryTransitionItems(
const Transaction::TransitionQueries& transactions);
241 void resetHighlights(
const Transaction::HighlightResets& transactions);
242 void removeHighlights(
const Transaction::HighlightRemoves& transactions);
243 void queryHighlights(
const Transaction::HighlightQueries& transactions);
245 void collectSubItems(ItemID parentId, ItemIDs& subItems)
const;
248 mutable std::mutex _selectionsMutex;
249 SelectionMap _selections;
251 std::unordered_map<int32_t, std::vector<Transaction::TransitionFinishedFunc>> _transitionFinishedOperatorMap;
253 void resetSelections(
const Transaction::SelectionResets& transactions);
260 mutable std::mutex _stagesMutex;
264 friend class RenderEngine;
267 typedef std::shared_ptr<Scene> ScenePointer;
268 typedef std::vector<ScenePointer> Scenes;