Showing the changes to libraries/entities/src/EntityScriptingInterface.cpp (1 of 27 files). Show all
Unified · Split
| @@ -1085,10 +1085,13 @@ QUuid EntityScriptingInterface::findClosestEntity(const glm::vec3& center, float · 1084 unmodified lines | |||
| 1085 | 1085 | ||
| 1086 | EntityItemID result; | 1086 | EntityItemID result; |
| 1087 | if (_entityTree) { | 1087 | if (_entityTree) { |
| 1088 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1088 | EntityItemPointer closestEntity; |
| 1089 | _entityTree->withReadLock([&] { | 1089 | _entityTree->withReadLock([&] { |
| 1090 | result = _entityTree->evalClosestEntity(center, radius, PickFilter(searchFilter)); | 1090 | closestEntity = _entityTree->findClosestEntity(center, radius); |
| 1091 | }); | 1091 | }); |
| 1092 | if (closestEntity) { | ||
| 1093 | result = closestEntity->getEntityItemID(); | ||
| 1094 | } | ||
| 1092 | } | 1095 | } |
| 1093 | return result; | 1096 | return result; |
| 1094 | } | 1097 | } |
| @@ -1107,10 +1110,14 @@ QVector<QUuid> EntityScriptingInterface::findEntities(const glm::vec3& center, f · 12 unmodified lines | |||
| 1107 | 1110 | ||
| 1108 | QVector<QUuid> result; | 1111 | QVector<QUuid> result; |
| 1109 | if (_entityTree) { | 1112 | if (_entityTree) { |
| 1110 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1113 | QVector<EntityItemPointer> entities; |
| 1111 | _entityTree->withReadLock([&] { | 1114 | _entityTree->withReadLock([&] { |
| 1112 | _entityTree->evalEntitiesInSphere(center, radius, PickFilter(searchFilter), result); | 1115 | _entityTree->findEntities(center, radius, entities); |
| 1113 | }); | 1116 | }); |
| 1117 | |||
| 1118 | foreach (EntityItemPointer entity, entities) { | ||
| 1119 | result << entity->getEntityItemID(); | ||
| 1120 | } | ||
| 1114 | } | 1121 | } |
| 1115 | return result; | 1122 | return result; |
| 1116 | } | 1123 | } |
| @@ -1120,11 +1127,15 @@ QVector<QUuid> EntityScriptingInterface::findEntitiesInBox(const glm::vec3& corn · 3 unmodified lines | |||
| 1120 | 1127 | ||
| 1121 | QVector<QUuid> result; | 1128 | QVector<QUuid> result; |
| 1122 | if (_entityTree) { | 1129 | if (_entityTree) { |
| 1123 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1130 | QVector<EntityItemPointer> entities; |
| 1124 | _entityTree->withReadLock([&] { | 1131 | _entityTree->withReadLock([&] { |
| 1125 | AABox box(corner, dimensions); | 1132 | AABox box(corner, dimensions); |
| 1126 | _entityTree->evalEntitiesInBox(box, PickFilter(searchFilter), result); | 1133 | _entityTree->findEntities(box, entities); |
| 1127 | }); | 1134 | }); |
| 1135 | |||
| 1136 | foreach (EntityItemPointer entity, entities) { | ||
| 1137 | result << entity->getEntityItemID(); | ||
| 1138 | } | ||
| 1128 | } | 1139 | } |
| 1129 | return result; | 1140 | return result; |
| 1130 | } | 1141 | } |
| @@ -1159,10 +1170,14 @@ QVector<QUuid> EntityScriptingInterface::findEntitiesInFrustum(QVariantMap frust · 28 unmodified lines | |||
| 1159 | viewFrustum.calculate(); | 1170 | viewFrustum.calculate(); |
| 1160 | 1171 | ||
| 1161 | if (_entityTree) { | 1172 | if (_entityTree) { |
| 1162 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1173 | QVector<EntityItemPointer> entities; |
| 1163 | _entityTree->withReadLock([&] { | 1174 | _entityTree->withReadLock([&] { |
| 1164 | _entityTree->evalEntitiesInFrustum(viewFrustum, PickFilter(searchFilter), result); | 1175 | _entityTree->findEntities(viewFrustum, entities); |
| 1165 | }); | 1176 | }); |
| 1177 | |||
| 1178 | foreach(EntityItemPointer entity, entities) { | ||
| 1179 | result << entity->getEntityItemID(); | ||
| 1180 | } | ||
| 1166 | } | 1181 | } |
| 1167 | } | 1182 | } |
| 1168 | 1183 | ||
| @@ -1174,64 +1189,86 @@ QVector<QUuid> EntityScriptingInterface::findEntitiesByType(const QString entity · 5 unmodified lines | |||
| 1174 | 1189 | ||
| 1175 | QVector<QUuid> result; | 1190 | QVector<QUuid> result; |
| 1176 | if (_entityTree) { | 1191 | if (_entityTree) { |
| 1177 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1192 | QVector<EntityItemPointer> entities; |
| 1178 | _entityTree->withReadLock([&] { | 1193 | _entityTree->withReadLock([&] { |
| 1179 | _entityTree->evalEntitiesInSphereWithType(center, radius, type, PickFilter(searchFilter), result); | 1194 | _entityTree->findEntities(center, radius, entities); |
| 1180 | }); | 1195 | }); |
| 1196 | |||
| 1197 | foreach(EntityItemPointer entity, entities) { | ||
| 1198 | if (entity->getType() == type) { | ||
| 1199 | result << entity->getEntityItemID().toString(); | ||
| 1200 | } | ||
| 1201 | } | ||
| 1181 | } | 1202 | } |
| 1182 | return result; | 1203 | return result; |
| 1183 | } | 1204 | } |
| 1184 | 1205 | ||
| 1185 | QVector<QUuid> EntityScriptingInterface::findEntitiesByName(const QString entityName, const glm::vec3& center, float radius, bool caseSensitiveSearch) const { | 1206 | QVector<QUuid> EntityScriptingInterface::findEntitiesByName(const QString entityName, const glm::vec3& center, float radius, bool caseSensitiveSearch) const { |
| 1207 | |||
| 1186 | QVector<QUuid> result; | 1208 | QVector<QUuid> result; |
| 1187 | if (_entityTree) { | 1209 | if (_entityTree) { |
| 1210 | QVector<EntityItemPointer> entities; | ||
| 1188 | _entityTree->withReadLock([&] { | 1211 | _entityTree->withReadLock([&] { |
| 1189 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1212 | _entityTree->findEntities(center, radius, entities); |
| 1190 | _entityTree->evalEntitiesInSphereWithName(center, radius, entityName, caseSensitiveSearch, PickFilter(searchFilter), result); | ||
| 1191 | }); | 1213 | }); |
| 1214 | |||
| 1215 | if (caseSensitiveSearch) { | ||
| 1216 | foreach(EntityItemPointer entity, entities) { | ||
| 1217 | if (entity->getName() == entityName) { | ||
| 1218 | result << entity->getEntityItemID(); | ||
| 1219 | } | ||
| 1220 | } | ||
| 1221 | |||
| 1222 | } else { | ||
| 1223 | QString entityNameLowerCase = entityName.toLower(); | ||
| 1224 | |||
| 1225 | foreach(EntityItemPointer entity, entities) { | ||
| 1226 | QString entityItemLowerCase = entity->getName().toLower(); | ||
| 1227 | if (entityItemLowerCase == entityNameLowerCase) { | ||
| 1228 | result << entity->getEntityItemID(); | ||
| 1229 | } | ||
| 1230 | } | ||
| 1231 | } | ||
| 1192 | } | 1232 | } |
| 1193 | return result; | 1233 | return result; |
| 1194 | } | 1234 | } |
| 1195 | 1235 | ||
| 1196 | RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, | 1236 | RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, |
| 1197 | const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) const { | 1237 | const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { |
| 1198 | PROFILE_RANGE(script_entities, __FUNCTION__); | ||
| 1199 | QVector<EntityItemID> entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); | 1238 | QVector<EntityItemID> entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); |
| 1200 | QVector<EntityItemID> entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); | 1239 | QVector<EntityItemID> entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); |
| 1201 | 1240 | ||
| 1202 | unsigned int searchFilter = PickFilter::getBitMask(PickFilter::FlagBit::DOMAIN_ENTITIES) | PickFilter::getBitMask(PickFilter::FlagBit::AVATAR_ENTITIES); | 1241 | return findRayIntersectionVector(ray, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly, collidableOnly); |
| 1203 | 1242 | } | |
| 1204 | if (!precisionPicking) { | ||
| 1205 | searchFilter = searchFilter | PickFilter::getBitMask(PickFilter::FlagBit::COARSE); | ||
| 1206 | } | ||
| 1207 | |||
| 1208 | if (visibleOnly) { | ||
| 1209 | searchFilter = searchFilter | PickFilter::getBitMask(PickFilter::FlagBit::VISIBLE); | ||
| 1210 | } | ||
| 1211 | 1243 | ||
| 1212 | if (collidableOnly) { | 1244 | RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionVector(const PickRay& ray, bool precisionPicking, |
| 1213 | searchFilter = searchFilter | PickFilter::getBitMask(PickFilter::FlagBit::COLLIDABLE); | 1245 | const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { |
| 1214 | } | 1246 | PROFILE_RANGE(script_entities, __FUNCTION__); |
| 1215 | 1247 | ||
| 1216 | return evalRayIntersectionWorker(ray, Octree::Lock, PickFilter(searchFilter), entitiesToInclude, entitiesToDiscard); | 1248 | return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly); |
| 1217 | } | 1249 | } |
| 1218 | 1250 | ||
| 1219 | RayToEntityIntersectionResult EntityScriptingInterface::evalRayIntersectionVector(const PickRay& ray, PickFilter searchFilter, | 1251 | // FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed |
| 1220 | const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard) { | 1252 | // findRayIntersection() to be blocking because it never makes sense for a script to get back a non-answer |
| 1221 | PROFILE_RANGE(script_entities, __FUNCTION__); | 1253 | RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking, |
| 1254 | const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { | ||
| 1222 | 1255 | ||
| 1223 | return evalRayIntersectionWorker(ray, Octree::Lock, searchFilter, entityIdsToInclude, entityIdsToDiscard); | 1256 | qWarning() << "Entities.findRayIntersectionBlocking() is obsolete, use Entities.findRayIntersection() instead."; |
| 1257 | const QVector<EntityItemID>& entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); | ||
| 1258 | const QVector<EntityItemID> entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); | ||
| 1259 | return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard); | ||
| 1224 | } | 1260 | } |
| 1225 | 1261 | ||
| 1226 | RayToEntityIntersectionResult EntityScriptingInterface::evalRayIntersectionWorker(const PickRay& ray, | 1262 | RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionWorker(const PickRay& ray, |
| 1227 | Octree::lockType lockType, PickFilter searchFilter, const QVector<EntityItemID>& entityIdsToInclude, | 1263 | Octree::lockType lockType, bool precisionPicking, const QVector<EntityItemID>& entityIdsToInclude, |
| 1228 | const QVector<EntityItemID>& entityIdsToDiscard) const { | 1264 | const QVector<EntityItemID>& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { |
| 1265 | |||
| 1229 | 1266 | ||
| 1230 | RayToEntityIntersectionResult result; | 1267 | RayToEntityIntersectionResult result; |
| 1231 | if (_entityTree) { | 1268 | if (_entityTree) { |
| 1232 | OctreeElementPointer element; | 1269 | OctreeElementPointer element; |
| 1233 | result.entityID = _entityTree->evalRayIntersection(ray.origin, ray.direction, | 1270 | result.entityID = _entityTree->findRayIntersection(ray.origin, ray.direction, |
| 1234 | entityIdsToInclude, entityIdsToDiscard, searchFilter, | 1271 | entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, precisionPicking, |
| 1235 | element, result.distance, result.face, result.surfaceNormal, | 1272 | element, result.distance, result.face, result.surfaceNormal, |
| 1236 | result.extraInfo, lockType, &result.accurate); | 1273 | result.extraInfo, lockType, &result.accurate); |
| 1237 | result.intersects = !result.entityID.isNull(); | 1274 | result.intersects = !result.entityID.isNull(); |
| @@ -1242,22 +1279,23 @@ RayToEntityIntersectionResult EntityScriptingInterface::evalRayIntersectionWorke · 4 unmodified lines | |||
| 1242 | return result; | 1279 | return result; |
| 1243 | } | 1280 | } |
| 1244 | 1281 | ||
| 1245 | ParabolaToEntityIntersectionResult EntityScriptingInterface::evalParabolaIntersectionVector(const PickParabola& parabola, PickFilter searchFilter, | 1282 | ParabolaToEntityIntersectionResult EntityScriptingInterface::findParabolaIntersectionVector(const PickParabola& parabola, bool precisionPicking, |
| 1246 | const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard) { | 1283 | const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { |
| 1247 | PROFILE_RANGE(script_entities, __FUNCTION__); | 1284 | PROFILE_RANGE(script_entities, __FUNCTION__); |
| 1248 | 1285 | ||
| 1249 | return evalParabolaIntersectionWorker(parabola, Octree::Lock, searchFilter, entityIdsToInclude, entityIdsToDiscard); | 1286 | return findParabolaIntersectionWorker(parabola, Octree::Lock, precisionPicking, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly); |
| 1250 | } | 1287 | } |
| 1251 | 1288 | ||
| 1252 | ParabolaToEntityIntersectionResult EntityScriptingInterface::evalParabolaIntersectionWorker(const PickParabola& parabola, | 1289 | ParabolaToEntityIntersectionResult EntityScriptingInterface::findParabolaIntersectionWorker(const PickParabola& parabola, |
| 1253 | Octree::lockType lockType, PickFilter searchFilter, const QVector<EntityItemID>& entityIdsToInclude, | 1290 | Octree::lockType lockType, bool precisionPicking, const QVector<EntityItemID>& entityIdsToInclude, |
| 1254 | const QVector<EntityItemID>& entityIdsToDiscard) const { | 1291 | const QVector<EntityItemID>& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { |
| 1292 | |||
| 1255 | 1293 | ||
| 1256 | ParabolaToEntityIntersectionResult result; | 1294 | ParabolaToEntityIntersectionResult result; |
| 1257 | if (_entityTree) { | 1295 | if (_entityTree) { |
| 1258 | OctreeElementPointer element; | 1296 | OctreeElementPointer element; |
| 1259 | result.entityID = _entityTree->evalParabolaIntersection(parabola, | 1297 | result.entityID = _entityTree->findParabolaIntersection(parabola, |
| 1260 | entityIdsToInclude, entityIdsToDiscard, searchFilter, | 1298 | entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, precisionPicking, |
| 1261 | element, result.intersection, result.distance, result.parabolicDistance, result.face, result.surfaceNormal, | 1299 | element, result.intersection, result.distance, result.parabolicDistance, result.face, result.surfaceNormal, |
| 1262 | result.extraInfo, lockType, &result.accurate); | 1300 | result.extraInfo, lockType, &result.accurate); |
| 1263 | result.intersects = !result.entityID.isNull(); | 1301 | result.intersects = !result.entityID.isNull(); |