making pre review requests

This commit is contained in:
Dante Ruiz 2019-01-11 15:57:09 -08:00
parent 8252481ce7
commit e7d3844620
13 changed files with 144 additions and 72 deletions

View file

@ -6774,8 +6774,7 @@ void Application::clearDomainOctreeDetails(bool clearAll) {
});
// reset the model renderer
qDebug() << "-----> clearAll: " << clearAll;
clearAll ? getEntities()->clear() : getEntities()->clearDomainEntities();
clearAll ? getEntities()->clear() : getEntities()->clearNonLocalEntities();
auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();

View file

@ -197,8 +197,57 @@ void EntityTreeRenderer::resetEntitiesScriptEngine() {
});
}
void EntityTreeRenderer::stopEntityScripts() {
leaveAllEntities();
void EntityTreeRenderer::stopNonLocalEntityScripts() {
leaveNonLocalEntities();
// unload and stop the engine
if (_entitiesScriptEngine) {
QList<EntityItemID> entitiesWithEntityScripts = _entitiesScriptEngine->getListOfEntityScriptIDs();
foreach (EntityItemID entityID, entitiesWithEntityScripts) {
EntityItemPointer entityItem = getTree()->findEntityByEntityItemID(entityID);
if (entityItem) {
if (!entityItem->isLocalEntity()) {
_entitiesScriptEngine->unloadEntityScript(entityID, true);
}
}
}
}
}
void EntityTreeRenderer::clearNonLocalEntities() {
stopNonLocalEntityScripts();
std::unordered_map<EntityItemID, EntityRendererPointer> savedEntities;
// remove all entities from the scene
_space->clear();
auto scene = _viewState->getMain3DScene();
if (scene) {
render::Transaction transaction;
for (const auto& entry : _entitiesInScene) {
const auto& renderer = entry.second;
const EntityItemPointer& entityItem = renderer->getEntity();
if (!entityItem->isLocalEntity()) {
renderer->removeFromScene(scene, transaction);
} else {
savedEntities[entry.first] = entry.second;
}
}
scene->enqueueTransaction(transaction);
} else {
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
}
_renderablesToUpdate = savedEntities;
_entitiesInScene = savedEntities;
_layeredZones.clearNonLocalLayeredZones();
OctreeProcessor::clearNonLocalEntities();
}
void EntityTreeRenderer::clear() {
leaveAllEntities();
// unload and stop the engine
if (_entitiesScriptEngine) {
// do this here (instead of in deleter) to avoid marshalling unload signals back to this thread
@ -210,44 +259,8 @@ void EntityTreeRenderer::stopEntityScripts() {
if (_wantScripts && !_shuttingDown) {
resetEntitiesScriptEngine();
}
}
void EntityTreeRenderer::clearDomainEntities() {
stopEntityScripts();
std::unordered_map<EntityItemID, EntityRendererPointer> savedEntities;
// remove all entities from the scene
_space->clear();
auto scene = _viewState->getMain3DScene();
if (scene) {
render::Transaction transaction;
for (const auto& entry : _entitiesInScene) {
const auto& renderer = entry.second;
const EntityItemPointer& entityItem = renderer->getEntity();
if (entityItem->isDomainEntity()) {
renderer->removeFromScene(scene, transaction);
} else {
savedEntities[entry.first] = entry.second;
}
}
scene->enqueueTransaction(transaction);
} else {
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
}
_entitiesInScene.clear();
_renderablesToUpdate = savedEntities;
_entitiesInScene = savedEntities;
// reset the zone to the default (while we load the next scene)
_layeredZones.clear();
OctreeProcessor::clearDomainEntities();
}
void EntityTreeRenderer::clear() {
stopEntityScripts();
// remove all entities from the scene
_space->clear();
auto scene = _viewState->getMain3DScene();
if (scene) {
@ -542,8 +555,7 @@ bool EntityTreeRenderer::findBestZoneAndMaybeContainingEntities(QVector<EntityIt
auto entityTree = std::static_pointer_cast<EntityTree>(_tree);
// FIXME - if EntityTree had a findEntitiesContainingPoint() this could theoretically be a little faster
entityTree->evalEntitiesInSphere(_avatarPosition, radius,
PickFilter(PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES)), entityIDs);
entityTree->evalEntitiesInSphere(_avatarPosition, radius, PickFilter(), entityIDs);
LayeredZones oldLayeredZones(std::move(_layeredZones));
_layeredZones.clear();
@ -649,6 +661,26 @@ bool EntityTreeRenderer::checkEnterLeaveEntities() {
return didUpdate;
}
void EntityTreeRenderer::leaveNonLocalEntities() {
if (_tree && !_shuttingDown) {
QVector<EntityItemID> currentLocalEntitiesInside;
foreach (EntityItemID entityID, _currentEntitiesInside) {
EntityItemPointer entityItem = getTree()->findEntityByEntityItemID(entityID);
if (!entityItem->isLocalEntity()) {
emit leaveEntity(entityID);
if (_entitiesScriptEngine) {
_entitiesScriptEngine->callEntityScriptMethod(entityID, "leaveEntity");
}
} else {
currentLocalEntitiesInside.push_back(entityID);
}
}
_currentEntitiesInside = currentLocalEntitiesInside;
forceRecheckEntities();
}
}
void EntityTreeRenderer::leaveAllEntities() {
if (_tree && !_shuttingDown) {
@ -1171,6 +1203,29 @@ EntityTreeRenderer::LayeredZones::LayeredZones(LayeredZones&& other) {
}
}
void EntityTreeRenderer::LayeredZones::clearNonLocalLayeredZones() {
std::set<LayeredZone> localLayeredZones;
std::map<QUuid, iterator> newMap;
for (auto iter = begin(); iter != end(); iter++) {
LayeredZone layeredZone = *iter;
if (layeredZone.zone->isLocalEntity()) {
bool success;
iterator it;
std::tie(it, success) = localLayeredZones.insert(layeredZone);
if (success) {
newMap.emplace(layeredZone.id, it);
}
}
}
std::set<LayeredZone>::operator=(localLayeredZones);
_map = newMap;
_skyboxLayer = empty() ? end() : begin();
}
void EntityTreeRenderer::LayeredZones::clear() {
std::set<LayeredZone>::clear();
_map.clear();

View file

@ -86,7 +86,7 @@ public:
virtual void init() override;
/// clears the tree
virtual void clearDomainEntities() override;
virtual void clearNonLocalEntities() override;
virtual void clear() override;
/// reloads the entity scripts, calling unload and preload
@ -162,7 +162,7 @@ private:
bool findBestZoneAndMaybeContainingEntities(QVector<EntityItemID>* entitiesContainingAvatar = nullptr);
bool applyLayeredZones();
void stopEntityScripts();
void stopNonLocalEntityScripts();
void checkAndCallPreload(const EntityItemID& entityID, bool reload = false, bool unloadFirst = false);
@ -171,6 +171,7 @@ private:
QScriptValueList createEntityArgs(const EntityItemID& entityID);
bool checkEnterLeaveEntities();
void leaveNonLocalEntities();
void leaveAllEntities();
void forceRecheckEntities();
@ -221,6 +222,7 @@ private:
LayeredZones& operator=(LayeredZones&&) = delete;
void clear();
void clearNonLocalLayeredZones();
std::pair<iterator, bool> insert(const LayeredZone& layer);
void update(std::shared_ptr<ZoneEntityItem> zone);
bool contains(const LayeredZones& other);

View file

@ -986,7 +986,7 @@ void EntityScriptingInterface::deleteEntity(QUuid id) {
shouldSendDeleteToServer = false;
} else {
// only delete local entities, server entities will round trip through the server filters
if (entity->isAvatarEntity() || _entityTree->isServerlessMode()) {
if (!entity->isDomainEntity() || _entityTree->isServerlessMode()) {
shouldSendDeleteToServer = false;
_entityTree->deleteEntity(entityID);

View file

@ -70,7 +70,7 @@ OctreeElementPointer EntityTree::createNewElement(unsigned char* octalCode) {
return std::static_pointer_cast<OctreeElement>(newElement);
}
void EntityTree::eraseDomainEntities() {
void EntityTree::eraseNonLocalEntities() {
emit clearingEntities();
if (_simulation) {
@ -84,10 +84,10 @@ void EntityTree::eraseDomainEntities() {
foreach(EntityItemPointer entity, localMap) {
EntityTreeElementPointer element = entity->getElement();
if (element) {
element->cleanupDomainEntities();
element->cleanupNonLocalEntities();
}
if (!entity->isDomainEntity()) {
if (entity->isLocalEntity()) {
savedEntities[entity->getEntityItemID()] = entity;
}
}
@ -100,7 +100,15 @@ void EntityTree::eraseDomainEntities() {
{
QWriteLocker locker(&_needsParentFixupLock);
_needsParentFixup.clear();
QVector<EntityItemWeakPointer> localEntitiesNeedsParentFixup;
foreach (EntityItemWeakPointer entityItem, _needsParentFixup) {
if (!entityItem.expired() && entityItem.lock()->isLocalEntity()) {
localEntitiesNeedsParentFixup.push_back(entityItem);
}
}
_needsParentFixup = localEntitiesNeedsParentFixup;
}
}
void EntityTree::eraseAllOctreeElements(bool createNewRoot) {

View file

@ -75,7 +75,7 @@ public:
}
virtual void eraseDomainEntities() override;
virtual void eraseNonLocalEntities() override;
virtual void eraseAllOctreeElements(bool createNewRoot = true) override;
virtual void readBitstreamToTree(const unsigned char* bitstream,

View file

@ -683,11 +683,11 @@ EntityItemPointer EntityTreeElement::getEntityWithEntityItemID(const EntityItemI
return foundEntity;
}
void EntityTreeElement::cleanupDomainEntities() {
void EntityTreeElement::cleanupNonLocalEntities() {
withWriteLock([&] {
EntityItems savedEntities;
foreach(EntityItemPointer entity, _entityItems) {
if (entity->isDomainEntity()) {
if (!entity->isLocalEntity()) {
entity->preDelete();
entity->_element = NULL;
} else {

View file

@ -189,7 +189,7 @@ public:
EntityItemPointer getEntityWithEntityItemID(const EntityItemID& id) const;
void getEntitiesInside(const AACube& box, QVector<EntityItemPointer>& foundEntities);
void cleanupDomainEntities();
void cleanupNonLocalEntities();
void cleanupEntities(); /// called by EntityTree on cleanup this will free all entities
bool removeEntityItem(EntityItemPointer entity, bool deletion = false);

View file

@ -149,7 +149,7 @@ public:
OctreeElementPointer getRoot() { return _rootElement; }
virtual void eraseDomainEntities() { _isDirty = true; };
virtual void eraseNonLocalEntities() { _isDirty = true; };
virtual void eraseAllOctreeElements(bool createNewRoot = true);
virtual void readBitstreamToTree(const unsigned char* bitstream, uint64_t bufferSizeBytes, ReadBitstreamToTreeParams& args);

View file

@ -198,10 +198,10 @@ void OctreeProcessor::processDatagram(ReceivedMessage& message, SharedNodePointe
}
void OctreeProcessor::clearDomainEntities() {
void OctreeProcessor::clearNonLocalEntities() {
if (_tree) {
_tree->withWriteLock([&] {
_tree->eraseDomainEntities();
_tree->eraseNonLocalEntities();
});
}
}

View file

@ -43,7 +43,7 @@ public:
virtual void init();
/// clears the tree
virtual void clearDomainEntities();
virtual void clearNonLocalEntities();
virtual void clear();
float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); }

View file

@ -2393,6 +2393,11 @@ void ScriptEngine::unloadEntityScript(const EntityItemID& entityID, bool shouldR
}
}
QList<EntityItemID> ScriptEngine::getListOfEntityScriptIDs() {
QReadLocker locker{ &_entityScriptsLock };
return _entityScripts.keys();
}
void ScriptEngine::unloadAllEntityScripts() {
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING

View file

@ -145,6 +145,9 @@ public:
QString getFilename() const;
QList<EntityItemID> getListOfEntityScriptIDs();
/**jsdoc
* Stop the current script.
* @function Script.stop