History

I finally understand - initial progress

Zach Fox committed 9 years ago

Commit 88c24c11 parent f01d9dd3 files · +129 −65Browse files

Showing the changes to interface/src/scripting/SelectionScriptingInterface.cpp (1 of 3 files). Show all

Unified · Split

interface/src/scripting/SelectionScriptingInterface.cpp+99−62
@@ -12,40 +12,61 @@ · 11 unmodified lines
12#include "SelectionScriptingInterface.h"12#include "SelectionScriptingInterface.h"
13#include "Application.h"13#include "Application.h"
14 14
15GameplayObjects::GameplayObjects() {
16}
17
18bool GameplayObjects::addToGameplayObjects(const QUuid& avatarID) {
19 _avatarIDs.push_back(avatarID);
20 return true;
21}
22bool GameplayObjects::removeFromGameplayObjects(const QUuid& avatarID) {
23 _avatarIDs.erase(std::remove(_avatarIDs.begin(), _avatarIDs.end(), avatarID), _avatarIDs.end());
24 return true;
25}
26
27bool GameplayObjects::addToGameplayObjects(const EntityItemID& entityID) {
28 _entityIDs.push_back(entityID);
29 return true;
30}
31bool GameplayObjects::removeFromGameplayObjects(const EntityItemID& entityID) {
32 _entityIDs.erase(std::remove(_entityIDs.begin(), _entityIDs.end(), entityID), _entityIDs.end());
33 return true;
34}
35
36bool GameplayObjects::addToGameplayObjects(const OverlayID& overlayID) {
37 _overlayIDs.push_back(overlayID);
38 return true;
39}
40bool GameplayObjects::removeFromGameplayObjects(const OverlayID& overlayID) {
41 _overlayIDs.erase(std::remove(_overlayIDs.begin(), _overlayIDs.end(), overlayID), _overlayIDs.end());
42 return true;
43}
44
15SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {45SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {
16 _viewState = viewState;46 _viewState = viewState;
17}47}
18 48
19//49//
20// START HANDLING ENTITIES50// START HANDLING AVATARS
21//51//
22render::ItemID getItemIDFromEntityID(const EntityItemID& entityID) {52bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const QUuid& avatarSessionID) {
23 auto entityTree = qApp->getEntities()->getTree();53 return addToGameplayObjects(listName, avatarSessionID);
24 entityTree->withReadLock([&] {
25 auto entityItem = entityTree->findEntityByEntityItemID(entityID);
26 if (entityItem != NULL) {
27 auto renderableInterface = entityItem->getRenderableInterface();
28 if (renderableInterface != NULL) {
29 return renderableInterface->getMetaRenderItemID();
30 }
31 }
32 return render::Item::INVALID_ITEM_ID;
33 });
34 return render::Item::INVALID_ITEM_ID;
35}54}
55bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const QUuid& avatarSessionID) {
56 return addToGameplayObjects(listName, avatarSessionID);
57}
58//
59// END HANDLING AVATARS
60//
61
62//
63// START HANDLING ENTITIES
64//
36bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {65bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
37 render::ItemID itemID = getItemIDFromEntityID(entityID);66 return addToGameplayObjects(listName, entityID);
38 if (itemID != render::Item::INVALID_ITEM_ID) {
39 return addToSelectedItemsList(listName, itemID);
40 }
41 return false;
42}67}
43bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {68bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
44 render::ItemID itemID = getItemIDFromEntityID(entityID);69 return addToGameplayObjects(listName, entityID);
45 if (itemID != render::Item::INVALID_ITEM_ID) {
46 return removeFromSelectedItemsList(listName, itemID);
47 }
48 return false;
49}70}
50//71//
51// END HANDLING ENTITIES72// END HANDLING ENTITIES
@@ -54,30 +75,11 @@ bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Sele · 2 unmodified lines
54//75//
55// START HANDLING OVERLAYS76// START HANDLING OVERLAYS
56//77//
57render::ItemID getItemIDFromOverlayID(const OverlayID& overlayID) {
58 auto& overlays = qApp->getOverlays();
59 auto overlay = overlays.getOverlay(overlayID);
60 if (overlay != NULL) {
61 auto itemID = overlay->getRenderItemID();
62 if (itemID != render::Item::INVALID_ITEM_ID) {
63 return overlay->getRenderItemID();
64 }
65 }
66 return render::Item::INVALID_ITEM_ID;
67}
68bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {78bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
69 render::ItemID itemID = getItemIDFromOverlayID(overlayID);79 return addToGameplayObjects(listName, overlayID);
70 if (itemID != render::Item::INVALID_ITEM_ID) {
71 return addToSelectedItemsList(listName, itemID);
72 }
73 return false;
74}80}
75bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {81bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
76 render::ItemID itemID = getItemIDFromOverlayID(overlayID);82 return addToGameplayObjects(listName, overlayID);
77 if (itemID != render::Item::INVALID_ITEM_ID) {
78 return removeFromSelectedItemsList(listName, itemID);
79 }
80 return false;
81}83}
82//84//
83// END HANDLING OVERLAYS85// END HANDLING OVERLAYS
@@ -86,31 +88,25 @@ bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Sele · 2 unmodified lines
86//88//
87// START HANDLING GENERIC ITEMS89// START HANDLING GENERIC ITEMS
88//90//
89bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToAdd) {91template <class T> bool SelectionScriptingInterface::addToGameplayObjects(const render::Selection::Name& listName, T idToAdd) {
90 if (_selectedItemsListMap.contains(listName)) {92 if (_selectedItemsListMap.contains(listName)) {
91 auto currentList = _selectedItemsListMap.take(listName);93 auto currentList = _selectedItemsListMap.take(listName);
92 currentList.push_back(idToAdd); // TODO: Ensure thread safety94 currentList.addToGameplayObjects(idToAdd);
93 _selectedItemsListMap.insert(listName, currentList);95 _selectedItemsListMap.insert(listName, currentList);
94 updateRendererSelectedList(listName);96 updateRendererSelectedList(listName);
95 return true;97 return true;
96 } else {98 } else {
97 _selectedItemsListMap.insert(listName, render::ItemIDs());99 _selectedItemsListMap.insert(listName, GameplayObjects());
98 return addToSelectedItemsList(listName, idToAdd);100 return addToSelectedItemsList(listName, idToAdd);
99 }101 }
100}102}
101bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToRemove) {103template <class T> bool SelectionScriptingInterface::removeFromGameplayObjects(const render::Selection::Name& listName, T idToRemove) {
102 auto hashItr = _selectedItemsListMap.find(listName);104 if (_selectedItemsListMap.contains(listName)) {
103 if (hashItr != _selectedItemsListMap.end()) {
104 auto currentList = _selectedItemsListMap.take(listName);105 auto currentList = _selectedItemsListMap.take(listName);
105 auto listItr = std::find(currentList.begin(), currentList.end(), idToRemove); // TODO: Ensure thread safety106 currentList.removeFromGameplayObjects(idToRemove);
106 if (listItr == currentList.end()) {107 _selectedItemsListMap.insert(listName, currentList);
107 return false;108 updateRendererSelectedList(listName);
108 } else {109 return true;
109 currentList.erase(listItr);
110 _selectedItemsListMap.insert(listName, currentList);
111 updateRendererSelectedList(listName);
112 return true;
113 }
114 } else {110 } else {
115 return false;111 return false;
116 }112 }
@@ -133,12 +129,53 @@ void SelectionScriptingInterface::updateRendererSelectedList(const render::Selec · 16 unmodified lines
133 render::Transaction transaction;129 render::Transaction transaction;
134 130
135 if (_selectedItemsListMap.contains(listName)) {131 if (_selectedItemsListMap.contains(listName)) {
136 render::Selection selection(listName, _selectedItemsListMap.value(listName));132 render::ItemIDs finalList;
133 render::ItemID currentID;
134 auto entityTree = qApp->getEntities()->getTree();
135 auto& overlays = qApp->getOverlays();
136 auto currentList = _selectedItemsListMap.value(listName);
137
138 for (QUuid& currentAvatarID : currentList.getAvatarIDs()) {
139 auto avatar = std::static_pointer_cast<Avatar>(DependencyManager::get<AvatarManager>()->getAvatarBySessionID(currentAvatarID));
140 if (avatar) {
141 currentID = avatar->getRenderItemID();
142 if (currentID != render::Item::INVALID_ITEM_ID) {
143 finalList.push_back(currentID);
144 }
145 }
146 }
147
148 for (EntityItemID& currentEntityID : currentList.getEntityIDs()) {
149 entityTree->withReadLock([&] {
150 auto entityItem = entityTree->findEntityByEntityItemID(currentEntityID);
151 if (entityItem != NULL) {
152 auto renderableInterface = entityItem->getRenderableInterface();
153 if (renderableInterface != NULL) {
154 currentID = renderableInterface->getMetaRenderItemID();
155 if (currentID != render::Item::INVALID_ITEM_ID) {
156 finalList.push_back(currentID);
157 }
158 }
159 }
160 });
161 }
162
163 for (OverlayID& currentOverlayID : currentList.getOverlayIDs()) {
164 auto overlay = overlays.getOverlay(currentOverlayID);
165 if (overlay != NULL) {
166 currentID = overlay->getRenderItemID();
167 if (currentID != render::Item::INVALID_ITEM_ID) {
168 finalList.push_back(currentID);
169 }
170 }
171 }
172
173 render::Selection selection(listName, finalList);
137 transaction.resetSelection(selection);174 transaction.resetSelection(selection);
138 175
139 scene->enqueueTransaction(transaction);176 scene->enqueueTransaction(transaction);
140 } else {177 } else {
141 qWarning() << "List of ItemIDs doesn't exist in _selectedItemsListMap";178 qWarning() << "List of GameplayObjects doesn't exist in _selectedItemsListMap";
142 }179 }
143 } else {180 } else {
144 qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown";181 qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown";