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
1212 #include "SelectionScriptingInterface.h"
1313 #include "Application.h"
1414
15+GameplayObjects::GameplayObjects() {
16+}
17+
18+bool GameplayObjects::addToGameplayObjects(const QUuid& avatarID) {
19+ _avatarIDs.push_back(avatarID);
20+ return true;
21+}
22+bool GameplayObjects::removeFromGameplayObjects(const QUuid& avatarID) {
23+ _avatarIDs.erase(std::remove(_avatarIDs.begin(), _avatarIDs.end(), avatarID), _avatarIDs.end());
24+ return true;
25+}
26+
27+bool GameplayObjects::addToGameplayObjects(const EntityItemID& entityID) {
28+ _entityIDs.push_back(entityID);
29+ return true;
30+}
31+bool GameplayObjects::removeFromGameplayObjects(const EntityItemID& entityID) {
32+ _entityIDs.erase(std::remove(_entityIDs.begin(), _entityIDs.end(), entityID), _entityIDs.end());
33+ return true;
34+}
35+
36+bool GameplayObjects::addToGameplayObjects(const OverlayID& overlayID) {
37+ _overlayIDs.push_back(overlayID);
38+ return true;
39+}
40+bool GameplayObjects::removeFromGameplayObjects(const OverlayID& overlayID) {
41+ _overlayIDs.erase(std::remove(_overlayIDs.begin(), _overlayIDs.end(), overlayID), _overlayIDs.end());
42+ return true;
43+}
44+
1545 SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {
1646 _viewState = viewState;
1747 }
1848
1949 //
20−// START HANDLING ENTITIES
50+// START HANDLING AVATARS
2151 //
22−render::ItemID getItemIDFromEntityID(const EntityItemID& entityID) {
23− auto entityTree = qApp->getEntities()->getTree();
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;
52+bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const QUuid& avatarSessionID) {
53+ return addToGameplayObjects(listName, avatarSessionID);
3554 }
55+bool 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+//
3665 bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
37− render::ItemID itemID = getItemIDFromEntityID(entityID);
38− if (itemID != render::Item::INVALID_ITEM_ID) {
39− return addToSelectedItemsList(listName, itemID);
40− }
41− return false;
66+ return addToGameplayObjects(listName, entityID);
4267 }
4368 bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
44− render::ItemID itemID = getItemIDFromEntityID(entityID);
45− if (itemID != render::Item::INVALID_ITEM_ID) {
46− return removeFromSelectedItemsList(listName, itemID);
47− }
48− return false;
69+ return addToGameplayObjects(listName, entityID);
4970 }
5071 //
5172 // END HANDLING ENTITIES
@@ -54,30 +75,11 @@ bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Sele · 2 unmodified lines
5475 //
5576 // START HANDLING OVERLAYS
5677 //
57−render::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−}
6878 bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
69− render::ItemID itemID = getItemIDFromOverlayID(overlayID);
70− if (itemID != render::Item::INVALID_ITEM_ID) {
71− return addToSelectedItemsList(listName, itemID);
72− }
73− return false;
79+ return addToGameplayObjects(listName, overlayID);
7480 }
7581 bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
76− render::ItemID itemID = getItemIDFromOverlayID(overlayID);
77− if (itemID != render::Item::INVALID_ITEM_ID) {
78− return removeFromSelectedItemsList(listName, itemID);
79− }
80− return false;
82+ return addToGameplayObjects(listName, overlayID);
8183 }
8284 //
8385 // END HANDLING OVERLAYS
@@ -86,31 +88,25 @@ bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Sele · 2 unmodified lines
8688 //
8789 // START HANDLING GENERIC ITEMS
8890 //
89−bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToAdd) {
91+template <class T> bool SelectionScriptingInterface::addToGameplayObjects(const render::Selection::Name& listName, T idToAdd) {
9092 if (_selectedItemsListMap.contains(listName)) {
9193 auto currentList = _selectedItemsListMap.take(listName);
92− currentList.push_back(idToAdd); // TODO: Ensure thread safety
94+ currentList.addToGameplayObjects(idToAdd);
9395 _selectedItemsListMap.insert(listName, currentList);
9496 updateRendererSelectedList(listName);
9597 return true;
9698 } else {
97− _selectedItemsListMap.insert(listName, render::ItemIDs());
99+ _selectedItemsListMap.insert(listName, GameplayObjects());
98100 return addToSelectedItemsList(listName, idToAdd);
99101 }
100102 }
101−bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToRemove) {
102− auto hashItr = _selectedItemsListMap.find(listName);
103− if (hashItr != _selectedItemsListMap.end()) {
103+template <class T> bool SelectionScriptingInterface::removeFromGameplayObjects(const render::Selection::Name& listName, T idToRemove) {
104+ if (_selectedItemsListMap.contains(listName)) {
104105 auto currentList = _selectedItemsListMap.take(listName);
105− auto listItr = std::find(currentList.begin(), currentList.end(), idToRemove); // TODO: Ensure thread safety
106− if (listItr == currentList.end()) {
107− return false;
108− } else {
109− currentList.erase(listItr);
110− _selectedItemsListMap.insert(listName, currentList);
111− updateRendererSelectedList(listName);
112− return true;
113− }
106+ currentList.removeFromGameplayObjects(idToRemove);
107+ _selectedItemsListMap.insert(listName, currentList);
108+ updateRendererSelectedList(listName);
109+ return true;
114110 } else {
115111 return false;
116112 }
@@ -133,12 +129,53 @@ void SelectionScriptingInterface::updateRendererSelectedList(const render::Selec · 16 unmodified lines
133129 render::Transaction transaction;
134130
135131 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);
137174 transaction.resetSelection(selection);
138175
139176 scene->enqueueTransaction(transaction);
140177 } else {
141− qWarning() << "List of ItemIDs doesn't exist in _selectedItemsListMap";
178+ qWarning() << "List of GameplayObjects doesn't exist in _selectedItemsListMap";
142179 }
143180 } else {
144181 qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown";