First bit of cleanup

consolidate to one map, some minor other cleaning.  More coming.
This commit is contained in:
David Kelly 2017-02-10 14:57:09 -07:00
parent 1c1b0d1332
commit 2996298e79
4 changed files with 37 additions and 50 deletions

View file

@ -322,7 +322,6 @@ void EntityServer::entityFilterAdded(EntityItemID id, bool success) {
} }
} }
void EntityServer::nodeAdded(SharedNodePointer node) { void EntityServer::nodeAdded(SharedNodePointer node) {
EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree); EntityTreePointer tree = std::static_pointer_cast<EntityTree>(_tree);
tree->knowAvatarID(node->getUUID()); tree->knowAvatarID(node->getUUID());

View file

@ -19,15 +19,17 @@ QList<EntityItemID> EntityEditFilters::getZonesByPosition(glm::vec3& position) {
QList<EntityItemID> zones; QList<EntityItemID> zones;
QList<EntityItemID> missingZones; QList<EntityItemID> missingZones;
_lock.lockForRead(); _lock.lockForRead();
qCDebug(entities) << "looking at " << _filterFunctionMap.size() << "possible zones, at " << position; auto zoneIDs = _filterDataMap.keys();
for (auto it = _filterFunctionMap.begin(); it != _filterFunctionMap.end(); it++) { _lock.unlock();
auto id = it.key(); qCDebug(entities) << "looking at " << zoneIDs.size() << "possible zones, at " << position;
for (auto id : zoneIDs) {
if (!id.isInvalidID()) { if (!id.isInvalidID()) {
// for now, look it up in the tree (soon we need to cache or similar?) // for now, look it up in the tree (soon we need to cache or similar?)
EntityItemPointer itemPtr = _tree->findEntityByEntityItemID(id); EntityItemPointer itemPtr = _tree->findEntityByEntityItemID(id);
auto zone = std::dynamic_pointer_cast<ZoneEntityItem>(itemPtr); auto zone = std::dynamic_pointer_cast<ZoneEntityItem>(itemPtr);
if (!zone) { if (!zone) {
missingZones.append(id); // TODO: maybe remove later?
removeFilter(id);
} else if (zone->contains(position)) { } else if (zone->contains(position)) {
zones.append(id); zones.append(id);
} }
@ -37,12 +39,6 @@ QList<EntityItemID> EntityEditFilters::getZonesByPosition(glm::vec3& position) {
zones.append(id); zones.append(id);
} }
} }
_lock.unlock();
// TODO: maybe do this later (not block filter)
// now remove filters for missing zones
for (auto id : missingZones) {
removeFilter(id);
}
return zones; return zones;
} }
@ -59,28 +55,20 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper
// lies within // lies within
auto zoneIDs = getZonesByPosition(position); auto zoneIDs = getZonesByPosition(position);
// temp debugging -- remove! for (auto id : zoneIDs) {
qCDebug(entities) << "zones:"; qCDebug(entities) << "applying filter for zone" << id;
for (auto zoneID : zoneIDs) {
qCDebug(entities) << zoneID << ",";
}
for (auto it = zoneIDs.begin(); it != zoneIDs.end(); it++) {
qCDebug(entities) << "applying filter for zone" << *it;
// get the filter pair, etc... // get the filter pair, etc...
_lock.lockForRead(); _lock.lockForRead();
FilterFunctionPair* pair = _filterFunctionMap.value(*it); FilterData filterData = _filterDataMap.value(id);
QScriptEngine* engine = _filterScriptEngineMap.value(*it);
_lock.unlock(); _lock.unlock();
qCDebug(entities) << "pair: " << (qint64) pair << ", engine" << (qint64)engine; if (filterData.valid()) {
if (pair != nullptr && engine != nullptr) {
auto oldProperties = propertiesIn.getDesiredProperties(); auto oldProperties = propertiesIn.getDesiredProperties();
auto specifiedProperties = propertiesIn.getChangedProperties(); auto specifiedProperties = propertiesIn.getChangedProperties();
propertiesIn.setDesiredProperties(specifiedProperties); propertiesIn.setDesiredProperties(specifiedProperties);
QScriptValue inputValues = propertiesIn.copyToScriptValue(engine, false, true, true); QScriptValue inputValues = propertiesIn.copyToScriptValue(filterData.engine, false, true, true);
propertiesIn.setDesiredProperties(oldProperties); propertiesIn.setDesiredProperties(oldProperties);
auto in = QJsonValue::fromVariant(inputValues.toVariant()); // grab json copy now, because the inputValues might be side effected by the filter. auto in = QJsonValue::fromVariant(inputValues.toVariant()); // grab json copy now, because the inputValues might be side effected by the filter.
@ -88,8 +76,8 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper
args << inputValues; args << inputValues;
args << filterType; args << filterType;
QScriptValue result = pair->first.call(_nullObjectForFilter, args); QScriptValue result = filterData.filterFn.call(_nullObjectForFilter, args);
if (pair->second()) { if (filterData.uncaughtExceptions()) {
result = QScriptValue(); result = QScriptValue();
} }
@ -106,7 +94,7 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper
wasChanged |= (in != out); wasChanged |= (in != out);
} else { } else {
// an edit was rejected, so we stop here and return false // an edit was rejected, so we stop here and return false
qCDebug(entities) << "Edit rejected by filter " << *it ; qCDebug(entities) << "Edit rejected by filter " << id ;
return false; return false;
} }
} }
@ -117,16 +105,11 @@ bool EntityEditFilters::filter(glm::vec3& position, EntityItemProperties& proper
void EntityEditFilters::removeFilter(EntityItemID& entityID) { void EntityEditFilters::removeFilter(EntityItemID& entityID) {
QWriteLocker writeLock(&_lock); QWriteLocker writeLock(&_lock);
QScriptEngine* engine = _filterScriptEngineMap.value(entityID); FilterData filterData = _filterDataMap.value(entityID);
if (engine) { if (filterData.valid()) {
_filterScriptEngineMap.remove(entityID); delete filterData.engine;
delete engine;
}
FilterFunctionPair* pair = _filterFunctionMap.value(entityID);
if (pair) {
_filterFunctionMap.remove(entityID);
delete pair;
} }
_filterDataMap.remove(entityID);
} }
void EntityEditFilters::addFilter(EntityItemID& entityID, QString filterURL) { void EntityEditFilters::addFilter(EntityItemID& entityID, QString filterURL) {
@ -210,14 +193,12 @@ void EntityEditFilters::scriptRequestFinished(EntityItemID entityID) {
engine->evaluate(scriptContents); engine->evaluate(scriptContents);
if (!hadUncaughtExceptions(*engine, urlString)) { if (!hadUncaughtExceptions(*engine, urlString)) {
// put the engine in the engine map (so we don't leak them, etc...) // put the engine in the engine map (so we don't leak them, etc...)
_lock.lockForWrite(); FilterData filterData;
_filterScriptEngineMap.insert(entityID, engine); filterData.engine = engine;
_lock.unlock();
// define the uncaughtException function // define the uncaughtException function
FilterFunctionPair* pair = new FilterFunctionPair();
QScriptEngine& engineRef = *engine; QScriptEngine& engineRef = *engine;
pair->second = [this, &engineRef, &urlString]() { return hadUncaughtExceptions(engineRef, urlString); }; filterData.uncaughtExceptions = [this, &engineRef, &urlString]() { return hadUncaughtExceptions(engineRef, urlString); };
// now get the filter function // now get the filter function
auto global = engine->globalObject(); auto global = engine->globalObject();
@ -226,13 +207,15 @@ void EntityEditFilters::scriptRequestFinished(EntityItemID entityID) {
entitiesObject.setProperty("EDIT_FILTER_TYPE", EntityTree::FilterType::Edit); entitiesObject.setProperty("EDIT_FILTER_TYPE", EntityTree::FilterType::Edit);
entitiesObject.setProperty("PHYSICS_FILTER_TYPE", EntityTree::FilterType::Physics); entitiesObject.setProperty("PHYSICS_FILTER_TYPE", EntityTree::FilterType::Physics);
global.setProperty("Entities", entitiesObject); global.setProperty("Entities", entitiesObject);
pair->first = global.property("filter"); filterData.filterFn = global.property("filter");
if (!pair->first.isFunction()) { if (!filterData.filterFn.isFunction()) {
qDebug() << "Filter function specified but not found. Ignoring filter"; qDebug() << "Filter function specified but not found. Ignoring filter";
delete engine;
return; return;
} }
_lock.lockForWrite(); _lock.lockForWrite();
_filterFunctionMap.insert(entityID, pair); _filterDataMap.insert(entityID, filterData);
_lock.unlock(); _lock.unlock();
qDebug() << "script request filter processed for entity id " << entityID; qDebug() << "script request filter processed for entity id " << entityID;

View file

@ -23,11 +23,17 @@
#include "EntityItemProperties.h" #include "EntityItemProperties.h"
#include "EntityTree.h" #include "EntityTree.h"
typedef QPair<QScriptValue, std::function<bool()>> FilterFunctionPair;
class EntityEditFilters : public QObject, public Dependency { class EntityEditFilters : public QObject, public Dependency {
Q_OBJECT Q_OBJECT
public: public:
struct FilterData {
QScriptValue filterFn;
std::function<bool()> uncaughtExceptions;
QScriptEngine* engine;
bool valid() { return (engine != nullptr && filterFn.isFunction() && uncaughtExceptions); }
};
EntityEditFilters() {}; EntityEditFilters() {};
EntityEditFilters(EntityTreePointer tree ): _tree(tree) {}; EntityEditFilters(EntityTreePointer tree ): _tree(tree) {};
@ -51,8 +57,7 @@ private:
QScriptValue _nullObjectForFilter{}; QScriptValue _nullObjectForFilter{};
QReadWriteLock _lock; QReadWriteLock _lock;
QMap<EntityItemID, FilterFunctionPair*> _filterFunctionMap; QMap<EntityItemID, FilterData> _filterDataMap;
QMap<EntityItemID, QScriptEngine*> _filterScriptEngineMap;
}; };
#endif //hifi_EntityEditFilters_h #endif //hifi_EntityEditFilters_h