diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index d784950267..c91913f3dd 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -96,7 +96,7 @@ void EntityTreeRenderer::init() { // make sure our "last avatar position" is something other than our current position, so that on our // first chance, we'll check for enter/leave entity events. - _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3(1.0f, 1.0f, 1.0f); + _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3((float)TREE_SCALE); connect(entityTree, &EntityTree::deletingEntity, this, &EntityTreeRenderer::deletingEntity); connect(entityTree, &EntityTree::addingEntity, this, &EntityTreeRenderer::checkAndCallPreload); @@ -276,19 +276,19 @@ void EntityTreeRenderer::update() { void EntityTreeRenderer::checkEnterLeaveEntities() { if (_tree && !_shuttingDown) { _tree->lockForWrite(); // so that our scripts can do edits if they want - glm::vec3 avatarPosition = _viewState->getAvatarPosition() / (float) TREE_SCALE; + glm::vec3 avatarPosition = _viewState->getAvatarPosition(); if (avatarPosition != _lastAvatarPosition) { - float radius = 1.0f / (float) TREE_SCALE; // for now, assume 1 meter radius + float radius = 1.0f; // for now, assume 1 meter radius QVector foundEntities; QVector entitiesContainingAvatar; // find the entities near us - static_cast(_tree)->findEntities(avatarPosition, radius, foundEntities); + static_cast(_tree)->findEntitiesInMeters(avatarPosition, radius, foundEntities); // create a list of entities that actually contain the avatar's position foreach(const EntityItem* entity, foundEntities) { - if (entity->contains(avatarPosition)) { + if (entity->containsInMeters(avatarPosition)) { entitiesContainingAvatar << entity->getEntityItemID(); } } @@ -341,7 +341,7 @@ void EntityTreeRenderer::leaveAllEntities() { // make sure our "last avatar position" is something other than our current position, so that on our // first chance, we'll check for enter/leave entity events. - _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3(1.0f, 1.0f, 1.0f); + _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3((float)TREE_SCALE); _tree->unlock(); } } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 69b2370264..b24925dd6c 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -951,6 +951,12 @@ AACube EntityItem::getMinimumAACube() const { return AACube(cornerOfCube, longestSide); } +AABox EntityItem::getAABoxInMeters() const { + AABox box = getAABox(); + box *= (float)TREE_SCALE; + return box; +} + AABox EntityItem::getAABox() const { // _position represents the position of the registration point. diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 9ed55cc417..1aad9c27e0 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -215,6 +215,7 @@ public: float getSize() const; /// get maximum dimension in domain scale units (0.0 - 1.0) AACube getMaximumAACube() const; AACube getMinimumAACube() const; + AABox getAABoxInMeters() const; /// axis aligned bounding box in world-frame (meters) AABox getAABox() const; /// axis aligned bounding box in domain scale units (0.0 - 1.0) const QString& getScript() const { return _script; } @@ -253,6 +254,7 @@ public: // TODO: We need to get rid of these users of getRadius()... float getRadius() const; + virtual bool containsInMeters(const glm::vec3& point) const { return getAABoxInMeters().contains(point); } virtual bool contains(const glm::vec3& point) const { return getAABox().contains(point); } virtual void computeShapeInfo(ShapeInfo& info) const; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 8e152f375d..4ee54ca8ca 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -204,7 +204,7 @@ QVector EntityScriptingInterface::findEntities(const glm::vec3& ce if (_entityTree) { _entityTree->lockForRead(); QVector entities; - _entityTree->findEntities(center/(float)TREE_SCALE, radius/(float)TREE_SCALE, entities); + _entityTree->findEntitiesInMeters(center, radius, entities); _entityTree->unlock(); foreach (const EntityItem* entity, entities) { diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 1e915bdd0f..1c820564f0 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -491,8 +491,9 @@ bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) } // NOTE: assumes caller has handled locking -void EntityTree::findEntities(const glm::vec3& center, float radius, QVector& foundEntities) { - FindAllNearPointArgs args = { center, radius }; +void EntityTree::findEntitiesInMeters(const glm::vec3& center, float radius, QVector& foundEntities) { + // position and targetRadius are in meters, so we need to convert to TreeUnits in FindNearPointArgs + FindAllNearPointArgs args = { center / (float)TREE_SCALE, radius / (float)TREE_SCALE }; // NOTE: This should use recursion, since this is a spatial operation recurseTreeWithOperation(findInSphereOperation, &args); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index d85474cb33..e748df2548 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -105,11 +105,11 @@ public: /// finds all entities that touch a sphere - /// \param center the center of the sphere - /// \param radius the radius of the sphere + /// \param center the center of the sphere in world-frame (meters) + /// \param radius the radius of the sphere in world-frame (meters) /// \param foundEntities[out] vector of const EntityItem* /// \remark Side effect: any initial contents in foundEntities will be lost - void findEntities(const glm::vec3& center, float radius, QVector& foundEntities); + void findEntitiesInMeters(const glm::vec3& center, float radius, QVector& foundEntities); /// finds all entities that touch a cube /// \param cube the query cube diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp index 8823071132..cf02720976 100644 --- a/libraries/shared/src/AABox.cpp +++ b/libraries/shared/src/AABox.cpp @@ -471,17 +471,23 @@ AABox AABox::clamp(float min, float max) const { return AABox(clampedCorner, clampedScale); } -AABox& AABox::operator += (const glm::vec3& point) { - _corner = glm::min(_corner, point); - _scale = glm::max(_scale, point - _corner); - - return (*this); -} - -AABox& AABox::operator += (const AABox& box) { - if (!box.isInvalid()) { - (*this) += box._corner; - _scale = glm::max(_scale, box.calcTopFarLeft() - _corner); - } - return (*this); -} +AABox& AABox::operator += (const glm::vec3& point) { + _corner = glm::min(_corner, point); + _scale = glm::max(_scale, point - _corner); + + return (*this); +} + +AABox& AABox::operator += (const AABox& box) { + if (!box.isInvalid()) { + (*this) += box._corner; + _scale = glm::max(_scale, box.calcTopFarLeft() - _corner); + } + return (*this); +} + +AABox& AABox::operator *= (float multiplier) { + _corner *= multiplier; + _scale *= multiplier; + return (*this); +} diff --git a/libraries/shared/src/AABox.h b/libraries/shared/src/AABox.h index d862957642..71c1cf0650 100644 --- a/libraries/shared/src/AABox.h +++ b/libraries/shared/src/AABox.h @@ -72,9 +72,11 @@ public: AABox clamp(const glm::vec3& min, const glm::vec3& max) const; AABox clamp(float min, float max) const; - AABox& operator += (const glm::vec3& point); - AABox& operator += (const AABox& box); - + AABox& operator += (const glm::vec3& point); + AABox& operator += (const AABox& box); + + AABox& operator *= (float multiplier); + bool isInvalid() const { return _corner == glm::vec3(std::numeric_limits::infinity()); } private: