Merge branch 'workload' of https://github.com/highfidelity/hifi into workload

This commit is contained in:
samcake 2018-03-01 13:42:51 -08:00
commit 6e7ef1e609
6 changed files with 21 additions and 23 deletions

View file

@ -35,10 +35,6 @@ void EntityTreeHeadlessViewer::update() {
EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree); EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree);
tree->withTryWriteLock([&] { tree->withTryWriteLock([&] {
tree->update(); tree->update();
// flush final EntityTree references to deleted entities
std::vector<EntityItemPointer> deletedEntities;
tree->swapRemovedEntities(deletedEntities);
}); });
} }
} }

View file

@ -194,6 +194,7 @@ void EntityTreeRenderer::clear() {
} }
// remove all entities from the scene // remove all entities from the scene
_space->clear();
auto scene = _viewState->getMain3DScene(); auto scene = _viewState->getMain3DScene();
if (scene) { if (scene) {
render::Transaction transaction; render::Transaction transaction;
@ -431,18 +432,12 @@ void EntityTreeRenderer::update(bool simulate) {
_space->updateProxies(_spaceUpdates); _space->updateProxies(_spaceUpdates);
_spaceUpdates.clear(); _spaceUpdates.clear();
} }
{ // flush final EntityTree references to removed entities {
std::vector<EntityItemPointer> deletedEntities; std::vector<int32_t> staleProxies;
tree->swapRemovedEntities(deletedEntities); tree->swapStaleProxies(staleProxies);
{ // delete proxies from workload::Space {
std::vector<int32_t> deadProxies;
std::unique_lock<std::mutex> lock(_spaceLock); std::unique_lock<std::mutex> lock(_spaceLock);
for (auto entity : deletedEntities) { _space->deleteProxies(staleProxies);
int32_t spaceIndex = entity->getSpaceIndex();
disconnect(entity.get(), &EntityItem::spaceUpdate, this, &EntityTreeRenderer::handleSpaceUpdate);
deadProxies.push_back(spaceIndex);
}
_space->deleteProxies(deadProxies);
} }
} }

View file

@ -98,6 +98,7 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) {
if (_simulation) { if (_simulation) {
_simulation->clearEntities(); _simulation->clearEntities();
} }
_staleProxies.clear();
QHash<EntityItemID, EntityItemPointer> localMap; QHash<EntityItemID, EntityItemPointer> localMap;
localMap.swap(_entityMap); localMap.swap(_entityMap);
this->withWriteLock([&] { this->withWriteLock([&] {
@ -697,10 +698,11 @@ void EntityTree::processRemovedEntities(const DeleteEntityOperator& theOperator)
_simulation->prepareEntityForDelete(theEntity); _simulation->prepareEntityForDelete(theEntity);
} }
// We save a pointer to theEntity for external contexts that need it // keep a record of valid stale spaceIndices so they can be removed from the Space
// but this means: external contexts that remove entities from the tree int32_t spaceIndex = theEntity->getSpaceIndex();
// must occasionally swapRemovedEntities() to flush these references. if (spaceIndex != -1) {
_removedEntities.push_back(theEntity); _staleProxies.push_back(spaceIndex);
}
} }
} }
@ -2476,4 +2478,4 @@ bool EntityTree::removeMaterialFromOverlay(const QUuid& overlayID, graphics::Mat
return _removeMaterialFromOverlayOperator(overlayID, material, parentMaterialName); return _removeMaterialFromOverlayOperator(overlayID, material, parentMaterialName);
} }
return false; return false;
} }

View file

@ -283,7 +283,7 @@ public:
void setMyAvatar(std::shared_ptr<AvatarData> myAvatar) { _myAvatar = myAvatar; } void setMyAvatar(std::shared_ptr<AvatarData> myAvatar) { _myAvatar = myAvatar; }
void swapRemovedEntities(std::vector<EntityItemPointer>& entities) { entities.swap(_removedEntities); } void swapStaleProxies(std::vector<int>& proxies) { proxies.swap(_staleProxies); }
static void setAddMaterialToEntityOperator(std::function<bool(const QUuid&, graphics::MaterialLayer, const std::string&)> addMaterialToEntityOperator) { _addMaterialToEntityOperator = addMaterialToEntityOperator; } static void setAddMaterialToEntityOperator(std::function<bool(const QUuid&, graphics::MaterialLayer, const std::string&)> addMaterialToEntityOperator) { _addMaterialToEntityOperator = addMaterialToEntityOperator; }
static void setRemoveMaterialFromEntityOperator(std::function<bool(const QUuid&, graphics::MaterialPointer, const std::string&)> removeMaterialFromEntityOperator) { _removeMaterialFromEntityOperator = removeMaterialFromEntityOperator; } static void setRemoveMaterialFromEntityOperator(std::function<bool(const QUuid&, graphics::MaterialPointer, const std::string&)> removeMaterialFromEntityOperator) { _removeMaterialFromEntityOperator = removeMaterialFromEntityOperator; }
@ -415,7 +415,7 @@ private:
static std::function<bool(const QUuid&, graphics::MaterialLayer, const std::string&)> _addMaterialToOverlayOperator; static std::function<bool(const QUuid&, graphics::MaterialLayer, const std::string&)> _addMaterialToOverlayOperator;
static std::function<bool(const QUuid&, graphics::MaterialPointer, const std::string&)> _removeMaterialFromOverlayOperator; static std::function<bool(const QUuid&, graphics::MaterialPointer, const std::string&)> _removeMaterialFromOverlayOperator;
std::vector<EntityItemPointer> _removedEntities; std::vector<int32_t> _staleProxies;
}; };
#endif // hifi_EntityTree_h #endif // hifi_EntityTree_h

View file

@ -20,6 +20,11 @@
using namespace workload; using namespace workload;
void Space::clear() {
_proxies.clear();
_freeIndices.clear();
}
int32_t Space::createProxy(const Space::Sphere& newSphere) { int32_t Space::createProxy(const Space::Sphere& newSphere) {
if (_freeIndices.empty()) { if (_freeIndices.empty()) {
_proxies.emplace_back(Space::Proxy(newSphere)); _proxies.emplace_back(Space::Proxy(newSphere));

View file

@ -70,6 +70,7 @@ public:
Space() {} Space() {}
void clear();
int32_t createProxy(const Sphere& sphere); int32_t createProxy(const Sphere& sphere);
void deleteProxies(const std::vector<int32_t>& deadIndices); void deleteProxies(const std::vector<int32_t>& deadIndices);
void updateProxies(const std::vector<ProxyUpdate>& changedProxies); void updateProxies(const std::vector<ProxyUpdate>& changedProxies);
@ -79,7 +80,6 @@ public:
uint32_t getNumAllocatedProxies() const { return (uint32_t)(_proxies.size()); } uint32_t getNumAllocatedProxies() const { return (uint32_t)(_proxies.size()); }
void categorizeAndGetChanges(std::vector<Change>& changes); void categorizeAndGetChanges(std::vector<Change>& changes);
uint32_t copyProxyValues(Proxy* proxies, uint32_t numDestProxies); uint32_t copyProxyValues(Proxy* proxies, uint32_t numDestProxies);
private: private: