From 2ffb19a0ed1a7dad5a82ad776198017f323996e1 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 25 Feb 2015 14:35:04 -0800 Subject: [PATCH 01/28] getPosition() --> getPositionInDomainUnits() and friends --- interface/src/avatar/ModelReferential.cpp | 30 ++++++++------- interface/src/avatar/ModelReferential.h | 2 +- .../src/EntityTreeRenderer.cpp | 6 +-- .../src/RenderableBoxEntityItem.cpp | 4 +- .../src/RenderableLightEntityItem.cpp | 2 +- .../src/RenderableModelEntityItem.cpp | 4 +- .../src/RenderableSphereEntityItem.cpp | 2 +- .../src/RenderableTextEntityItem.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 38 +++++++++---------- libraries/entities/src/EntityItem.h | 34 ++++++++--------- libraries/entities/src/EntityTree.cpp | 2 +- libraries/entities/src/EntityTreeElement.cpp | 12 +++--- libraries/entities/src/ModelEntityItem.cpp | 4 +- libraries/entities/src/SphereEntityItem.cpp | 4 +- libraries/entities/src/TextEntityItem.cpp | 6 +-- libraries/entities/src/TextEntityItem.h | 2 +- .../entities/src/UpdateEntityOperator.cpp | 4 +- 17 files changed, 81 insertions(+), 77 deletions(-) diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index 5b72fddae7..9136e53fa5 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -32,9 +32,9 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); if (item != NULL) { - _refScale = item->getLargestDimension(); + _refScale = item->getLargestDimensionInDomainUnits(); _refRotation = item->getRotation(); - _refPosition = item->getPosition() * (float)TREE_SCALE; + _refPosition = item->getPositionInDomainUnits() * (float)TREE_SCALE; update(); } } @@ -51,9 +51,9 @@ ModelReferential::ModelReferential(const QUuid& entityID, EntityTree* tree, Avat return; } - _refScale = item->getLargestDimension(); + _refScale = item->getLargestDimensionInDomainUnits(); _refRotation = item->getRotation(); - _refPosition = item->getPosition() * (float)TREE_SCALE; + _refPosition = item->getPositionInDomainUnits() * (float)TREE_SCALE; glm::quat refInvRot = glm::inverse(_refRotation); _scale = _avatar->getTargetScale() / _refScale; @@ -68,8 +68,8 @@ void ModelReferential::update() { } bool somethingChanged = false; - if (item->getLargestDimension() != _refScale) { - _refScale = item->getLargestDimension(); + if (item->getLargestDimensionInDomainUnits() != _refScale) { + _refScale = item->getLargestDimensionInDomainUnits(); _avatar->setTargetScale(_refScale * _scale, true); somethingChanged = true; } @@ -78,8 +78,8 @@ void ModelReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPosition() != _refPosition || somethingChanged) { - _refPosition = item->getPosition(); + if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) { + _refPosition = item->getPositionInDomainUnits(); _avatar->setPosition(_refPosition * (float)TREE_SCALE + _refRotation * (_translation * _refScale), true); } } @@ -108,7 +108,7 @@ JointReferential::JointReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) { - _refScale = item->getLargestDimension(); + _refScale = item->getLargestDimensionInDomainUnits(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); } @@ -119,6 +119,7 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E ModelReferential(entityID, tree, avatar), _jointIndex(jointIndex) { + // TODO: Andrew to fix this using meters _type = JOINT; const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); @@ -128,17 +129,19 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E return; } - _refScale = item->getLargestDimension(); + _refScale = item->getLargestDimensionInDomainUnits(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); glm::quat refInvRot = glm::inverse(_refRotation); _scale = _avatar->getTargetScale() / _refScale; _rotation = refInvRot * _avatar->getOrientation(); + // BUG! _refPosition is in domain units, but avatar is in meters _translation = refInvRot * (avatar->getPosition() - _refPosition) / _refScale; } void JointReferential::update() { + // TODO: Andrew to fix this using meters const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) { @@ -146,8 +149,8 @@ void JointReferential::update() { } bool somethingChanged = false; - if (item->getLargestDimension() != _refScale) { - _refScale = item->getLargestDimension(); + if (item->getLargestDimensionInDomainUnits() != _refScale) { + _refScale = item->getLargestDimensionInDomainUnits(); _avatar->setTargetScale(_refScale * _scale, true); somethingChanged = true; } @@ -156,8 +159,9 @@ void JointReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPosition() != _refPosition || somethingChanged) { + if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) { model->getJointPositionInWorldFrame(_jointIndex, _refPosition); + // BUG! _refPosition is in domain units, but avatar is in meters _avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale), true); } } diff --git a/interface/src/avatar/ModelReferential.h b/interface/src/avatar/ModelReferential.h index adb5783de2..0b66acfac5 100644 --- a/interface/src/avatar/ModelReferential.h +++ b/interface/src/avatar/ModelReferential.h @@ -45,4 +45,4 @@ protected: uint32_t _jointIndex; }; -#endif // hifi_ModelReferential_h \ No newline at end of file +#endif // hifi_ModelReferential_h diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 975d0f515d..2710a9ebf4 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -485,9 +485,9 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glPopMatrix(); - glm::vec3 position = entity->getPosition() * (float) TREE_SCALE; - glm::vec3 center = entity->getCenter() * (float) TREE_SCALE; - glm::vec3 dimensions = entity->getDimensions() * (float) TREE_SCALE; + glm::vec3 position = entity->getPositionInDomainUnits() * (float) TREE_SCALE; + glm::vec3 center = entity->getCenterInDomainUnits() * (float) TREE_SCALE; + glm::vec3 dimensions = entity->getDimensionsInDomainUnits() * (float) TREE_SCALE; glm::quat rotation = entity->getRotation(); glPushMatrix(); diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index 7f2ba410d8..fe3375c274 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -26,8 +26,8 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableBoxEntityItem::render"); assert(getType() == EntityTypes::Box); glm::vec3 position = getPositionInMeters(); - glm::vec3 center = getCenter() * (float)TREE_SCALE; - glm::vec3 dimensions = getDimensions() * (float)TREE_SCALE; + glm::vec3 center = getCenterInDomainUnits() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 1e0a9b6fc7..5b1486a6e4 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -27,7 +27,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLightEntityItem::render"); assert(getType() == EntityTypes::Light); glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensions() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; glm::quat rotation = getRotation(); float largestDiameter = glm::max(dimensions.x, dimensions.y, dimensions.z); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index ef6853c43a..cf09d84895 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -114,9 +114,9 @@ void RenderableModelEntityItem::render(RenderArgs* args) { bool drawAsModel = hasModel(); - glm::vec3 position = getPosition() * (float)TREE_SCALE; + glm::vec3 position = getPositionInDomainUnits() * (float)TREE_SCALE; float size = getSize() * (float)TREE_SCALE; - glm::vec3 dimensions = getDimensions() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; if (drawAsModel) { remapTextures(); diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 427ed20a8b..fd0137812d 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -28,7 +28,7 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { assert(getType() == EntityTypes::Sphere); glm::vec3 position = getPositionInMeters(); glm::vec3 center = getCenterInMeters(); - glm::vec3 dimensions = getDimensions() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 4dc2a07249..d752ff7906 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -30,7 +30,7 @@ void RenderableTextEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableTextEntityItem::render"); assert(getType() == EntityTypes::Text); glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensions() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; glm::vec3 halfDimensions = dimensions / 2.0f; glm::quat rotation = getRotation(); float leftMargin = 0.1f; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 15d46603b5..8020dac639 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -221,12 +221,12 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_PAGED_PROPERTY, // PROP_CUSTOM_PROPERTIES_INCLUDED, - APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPosition()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensions()); // NOTE: PROP_RADIUS obsolete + APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPositionInDomainUnits()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensionsInDomainUnits()); // NOTE: PROP_RADIUS obsolete APPEND_ENTITY_PROPERTY(PROP_ROTATION, appendValue, getRotation()); APPEND_ENTITY_PROPERTY(PROP_DENSITY, appendValue, getDensity()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocity()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravity()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocityInDomainUnits()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravityInDomainUnits()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, appendValue, getDamping()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, appendValue, getLifetime()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT, appendValue, getScript()); @@ -502,7 +502,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef dataAt += propertyFlags.getEncodedLength(); bytesRead += propertyFlags.getEncodedLength(); - READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePosition); + READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInDomainUnits); // Old bitstreams had PROP_RADIUS, new bitstreams have PROP_DIMENSIONS if (args.bitstreamVersion < VERSION_ENTITIES_SUPPORT_DIMENSIONS) { @@ -516,13 +516,13 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } } } else { - READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensions); + READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInDomainUnits); } READ_ENTITY_PROPERTY_QUAT_SETTER(PROP_ROTATION, updateRotation); READ_ENTITY_PROPERTY_SETTER(PROP_DENSITY, float, updateDensity); - READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocity); - READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravity); + READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInDomainUnits); + READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInDomainUnits); READ_ENTITY_PROPERTY(PROP_DAMPING, float, _damping); READ_ENTITY_PROPERTY_SETTER(PROP_LIFETIME, float, updateLifetime); READ_ENTITY_PROPERTY_STRING(PROP_SCRIPT, setScript); @@ -717,7 +717,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasVelocity()) { // linear damping - glm::vec3 velocity = getVelocity(); + glm::vec3 velocity = getVelocityInDomainUnits(); if (_damping > 0.0f) { velocity *= powf(1.0f - _damping, timeElapsed); #ifdef WANT_DEBUG @@ -729,7 +729,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { } // integrate position forward - glm::vec3 position = getPosition(); + glm::vec3 position = getPositionInDomainUnits(); glm::vec3 newPosition = position + (velocity * timeElapsed); #ifdef WANT_DEBUG @@ -749,19 +749,19 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasGravity()) { // handle resting on surface case, this is definitely a bit of a hack, and it only works on the // "ground" plane of the domain, but for now it's what we've got - velocity += getGravity() * timeElapsed; + velocity += getGravityInDomainUnits() * timeElapsed; } float speed = glm::length(velocity); const float EPSILON_LINEAR_VELOCITY_LENGTH = 0.001f / (float)TREE_SCALE; // 1mm/sec if (speed < EPSILON_LINEAR_VELOCITY_LENGTH) { - setVelocity(ENTITY_ITEM_ZERO_VEC3); + setVelocityInDomainUnits(ENTITY_ITEM_ZERO_VEC3); if (speed > 0.0f) { _dirtyFlags |= EntityItem::DIRTY_MOTION_TYPE; } } else { - setPosition(position); - setVelocity(velocity); + setPositionInDomainUnits(position); + setVelocityInDomainUnits(velocity); } #ifdef WANT_DEBUG @@ -894,7 +894,7 @@ float EntityItem::getSize() const { } // TODO: doesn't this need to handle rotation? -glm::vec3 EntityItem::getCenter() const { +glm::vec3 EntityItem::getCenterInDomainUnits() const { return _position + (_dimensions * (glm::vec3(0.5f,0.5f,0.5f) - _registrationPoint)); } @@ -1008,7 +1008,7 @@ const float MIN_DAMPING_DELTA = 0.001f; const float MIN_GRAVITY_DELTA = 0.001f; const float MIN_SPIN_DELTA = 0.0003f; -void EntityItem::updatePosition(const glm::vec3& value) { +void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { if (glm::distance(_position, value) * (float)TREE_SCALE > MIN_POSITION_DELTA) { _position = value; _dirtyFlags |= EntityItem::DIRTY_POSITION; @@ -1023,7 +1023,7 @@ void EntityItem::updatePositionInMeters(const glm::vec3& value) { } } -void EntityItem::updateDimensions(const glm::vec3& value) { +void EntityItem::updateDimensionsInDomainUnits(const glm::vec3& value) { if (_dimensions != value) { _dimensions = glm::abs(value); _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); @@ -1072,7 +1072,7 @@ void EntityItem::updateMass(float mass) { } } -void EntityItem::updateVelocity(const glm::vec3& value) { +void EntityItem::updateVelocityInDomainUnits(const glm::vec3& value) { if (glm::distance(_velocity, value) * (float)TREE_SCALE > MIN_VELOCITY_DELTA) { if (glm::length(value) * (float)TREE_SCALE < MIN_VELOCITY_DELTA) { _velocity = ENTITY_ITEM_ZERO_VEC3; @@ -1102,7 +1102,7 @@ void EntityItem::updateDamping(float value) { } } -void EntityItem::updateGravity(const glm::vec3& value) { +void EntityItem::updateGravityInDomainUnits(const glm::vec3& value) { if (glm::distance(_gravity, value) * (float)TREE_SCALE > MIN_GRAVITY_DELTA) { _gravity = value; _dirtyFlags |= EntityItem::DIRTY_VELOCITY; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 99fafa3343..12189bf56b 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -145,26 +145,26 @@ public: // attributes applicable to all entity types EntityTypes::EntityType getType() const { return _type; } - const glm::vec3& getPosition() const { return _position; } /// get position in domain scale units (0.0 - 1.0) + const glm::vec3& getPositionInDomainUnits() const { return _position; } /// get position in domain scale units (0.0 - 1.0) glm::vec3 getPositionInMeters() const { return _position * (float) TREE_SCALE; } /// get position in meters /// set position in domain scale units (0.0 - 1.0) - void setPosition(const glm::vec3& value) { _position = value; } + void setPositionInDomainUnits(const glm::vec3& value) { _position = value; } void setPositionInMeters(const glm::vec3& value) /// set position in meter units (0.0 - TREE_SCALE) - { setPosition(glm::clamp(value / (float) TREE_SCALE, 0.0f, 1.0f)); } + { setPositionInDomainUnits(glm::clamp(value / (float) TREE_SCALE, 0.0f, 1.0f)); } - glm::vec3 getCenter() const; /// calculates center of the entity in domain scale units (0.0 - 1.0) - glm::vec3 getCenterInMeters() const { return getCenter() * (float) TREE_SCALE; } + glm::vec3 getCenterInDomainUnits() const; /// calculates center of the entity in domain scale units (0.0 - 1.0) + glm::vec3 getCenterInMeters() const { return getCenterInDomainUnits() * (float) TREE_SCALE; } - const glm::vec3& getDimensions() const { return _dimensions; } /// get dimensions in domain scale units (0.0 - 1.0) + const glm::vec3& getDimensionsInDomainUnits() const { return _dimensions; } /// get dimensions in domain scale units (0.0 - 1.0) glm::vec3 getDimensionsInMeters() const { return _dimensions * (float) TREE_SCALE; } /// get dimensions in meters - float getLargestDimension() const { return glm::length(_dimensions); } /// get the largest possible dimension + float getLargestDimensionInDomainUnits() const { return glm::length(_dimensions); } /// get the largest possible dimension /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensions(const glm::vec3& value) { _dimensions = value; } + virtual void setDimensionsInDomainUnits(const glm::vec3& value) { _dimensions = value; } /// set dimensions in meter units (0.0 - TREE_SCALE) this will also reset radius appropriately - void setDimensionsInMeters(const glm::vec3& value) { setDimensions(value / (float) TREE_SCALE); } + void setDimensionsInMeters(const glm::vec3& value) { setDimensionsInDomainUnits(value / (float) TREE_SCALE); } const glm::quat& getRotation() const { return _rotation; } void setRotation(const glm::quat& rotation) { _rotation = rotation; } @@ -181,15 +181,15 @@ public: float getDensity() const { return _density; } - const glm::vec3& getVelocity() const { return _velocity; } /// velocity in domain scale units (0.0-1.0) per second + const glm::vec3& getVelocityInDomainUnits() const { return _velocity; } /// velocity in domain scale units (0.0-1.0) per second glm::vec3 getVelocityInMeters() const { return _velocity * (float) TREE_SCALE; } /// get velocity in meters - void setVelocity(const glm::vec3& value) { _velocity = value; } /// velocity in domain scale units (0.0-1.0) per second + void setVelocityInDomainUnits(const glm::vec3& value) { _velocity = value; } /// velocity in domain scale units (0.0-1.0) per second void setVelocityInMeters(const glm::vec3& value) { _velocity = value / (float) TREE_SCALE; } /// velocity in meters bool hasVelocity() const { return _velocity != ENTITY_ITEM_ZERO_VEC3; } - const glm::vec3& getGravity() const { return _gravity; } /// gravity in domain scale units (0.0-1.0) per second squared + const glm::vec3& getGravityInDomainUnits() const { return _gravity; } /// gravity in domain scale units (0.0-1.0) per second squared glm::vec3 getGravityInMeters() const { return _gravity * (float) TREE_SCALE; } /// get gravity in meters - void setGravity(const glm::vec3& value) { _gravity = value; } /// gravity in domain scale units (0.0-1.0) per second squared + void setGravityInDomainUnits(const glm::vec3& value) { _gravity = value; } /// gravity in domain scale units (0.0-1.0) per second squared void setGravityInMeters(const glm::vec3& value) { _gravity = value / (float) TREE_SCALE; } /// gravity in meters bool hasGravity() const { return _gravity != ENTITY_ITEM_ZERO_VEC3; } @@ -261,17 +261,17 @@ public: virtual ShapeType getShapeType() const { return SHAPE_TYPE_NONE; } // updateFoo() methods to be used when changes need to be accumulated in the _dirtyFlags - void updatePosition(const glm::vec3& value); + void updatePositionInDomainUnits(const glm::vec3& value); void updatePositionInMeters(const glm::vec3& value); - void updateDimensions(const glm::vec3& value); + void updateDimensionsInDomainUnits(const glm::vec3& value); void updateDimensionsInMeters(const glm::vec3& value); void updateRotation(const glm::quat& rotation); void updateDensity(float value); void updateMass(float value); - void updateVelocity(const glm::vec3& value); + void updateVelocityInDomainUnits(const glm::vec3& value); void updateVelocityInMeters(const glm::vec3& value); void updateDamping(float value); - void updateGravity(const glm::vec3& value); + void updateGravityInDomainUnits(const glm::vec3& value); void updateGravityInMeters(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); void updateAngularDamping(float value); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 95617b4944..65e665c29e 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -433,7 +433,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) // we may have gotten NULL back, meaning no entity was available if (thisClosestEntity) { - glm::vec3 entityPosition = thisClosestEntity->getPosition(); + glm::vec3 entityPosition = thisClosestEntity->getPositionInDomainUnits(); float distanceFromPointToEntity = glm::distance(entityPosition, args->position); // If we're within our target radius diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index ecd90e5942..4b4bae662a 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -494,11 +494,11 @@ bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, con // extents is the entity relative, scaled, centered extents of the entity glm::mat4 rotation = glm::mat4_cast(entity->getRotation()); - glm::mat4 translation = glm::translate(entity->getPosition()); + glm::mat4 translation = glm::translate(entity->getPositionInDomainUnits()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = entity->getDimensions(); + glm::vec3 dimensions = entity->getDimensionsInDomainUnits(); glm::vec3 registrationPoint = entity->getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); @@ -549,7 +549,7 @@ bool EntityTreeElement::findSpherePenetration(const glm::vec3& center, float rad QList::const_iterator entityEnd = _entityItems->end(); while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - glm::vec3 entityCenter = entity->getPosition(); + glm::vec3 entityCenter = entity->getPositionInDomainUnits(); float entityRadius = entity->getRadius(); // don't penetrate yourself @@ -585,7 +585,7 @@ const EntityItem* EntityTreeElement::getClosestEntity(glm::vec3 position) const float closestEntityDistance = FLT_MAX; uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { - float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPosition()); + float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPositionInDomainUnits()); if (distanceToEntity < closestEntityDistance) { closestEntity = (*_entityItems)[i]; } @@ -598,7 +598,7 @@ void EntityTreeElement::getEntities(const glm::vec3& searchPosition, float searc uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { const EntityItem* entity = (*_entityItems)[i]; - float distance = glm::length(entity->getPosition() - searchPosition); + float distance = glm::length(entity->getPositionInDomainUnits() - searchPosition); if (distance < searchRadius + entity->getRadius()) { foundEntities.push_back(entity); } @@ -616,7 +616,7 @@ void EntityTreeElement::getEntities(const AACube& box, QVector& fou // NOTE: we actually do cube-cube collision queries here, which is sloppy but good enough for now // TODO: decide whether to replace entityCube-cube query with sphere-cube (requires a square root // but will be slightly more accurate). - entityCube.setBox(entity->getPosition() - glm::vec3(radius), 2.0f * radius); + entityCube.setBox(entity->getPositionInDomainUnits() - glm::vec3(radius), 2.0f * radius); if (entityCube.touches(box)) { foundEntities.push_back(entity); } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 4d8e741cc6..61a2a294cf 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -265,8 +265,8 @@ void ModelEntityItem::update(const quint64& now) { void ModelEntityItem::debugDump() const { qDebug() << "ModelEntityItem id:" << getEntityItemID(); qDebug() << " edited ago:" << getEditedAgo(); - qDebug() << " position:" << getPosition() * (float)TREE_SCALE; - qDebug() << " dimensions:" << getDimensions() * (float)TREE_SCALE; + qDebug() << " position:" << getPositionInDomainUnits() * (float)TREE_SCALE; + qDebug() << " dimensions:" << getDimensionsInDomainUnits() * (float)TREE_SCALE; qDebug() << " model URL:" << getModelURL(); } diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 7d5fb83a4e..6b773d8189 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -98,9 +98,9 @@ bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, cons bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { // determine the ray in the frame of the entity transformed from a unit sphere - glm::mat4 translation = glm::translate(getPosition()); + glm::mat4 translation = glm::translate(getPositionInDomainUnits()); glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 scale = glm::scale(getDimensions()); + glm::mat4 scale = glm::scale(getDimensionsInDomainUnits()); glm::mat4 registration = glm::translate(glm::vec3(0.5f, 0.5f, 0.5f) - getRegistrationPoint()); glm::mat4 entityToWorldMatrix = translation * rotation * scale * registration; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index ac9a080119..051463929c 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -40,7 +40,7 @@ TextEntityItem::TextEntityItem(const EntityItemID& entityItemID, const EntityIte setProperties(properties); } -void TextEntityItem::setDimensions(const glm::vec3& value) { +void TextEntityItem::setDimensionsInDomainUnits(const glm::vec3& value) { // NOTE: Text Entities always have a "depth" of 1cm. float fixedDepth = 0.01f / (float)TREE_SCALE; _dimensions = glm::vec3(value.x, value.y, fixedDepth); @@ -145,11 +145,11 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const // now we know the point the ray hit our plane glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 translation = glm::translate(getPosition()); + glm::mat4 translation = glm::translate(getPositionInDomainUnits()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = getDimensions(); + glm::vec3 dimensions = getDimensionsInDomainUnits(); glm::vec3 registrationPoint = getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); AABox entityFrameBox(corner, dimensions); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 1f0bd7d85e..485cf52d95 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -23,7 +23,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensions(const glm::vec3& value); + virtual void setDimensionsInDomainUnits(const glm::vec3& value); // methods for getting/setting all properties of an entity virtual EntityItemProperties getProperties() const; diff --git a/libraries/entities/src/UpdateEntityOperator.cpp b/libraries/entities/src/UpdateEntityOperator.cpp index 29ed430f7a..43052c6a73 100644 --- a/libraries/entities/src/UpdateEntityOperator.cpp +++ b/libraries/entities/src/UpdateEntityOperator.cpp @@ -59,7 +59,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, // get the old property value and set it in our properties in order for our bounds // calculations to work. if (_properties.containsPositionChange() && !_properties.containsDimensionsChange()) { - glm::vec3 oldDimensionsInMeters = _existingEntity->getDimensions() * (float)TREE_SCALE; + glm::vec3 oldDimensionsInMeters = _existingEntity->getDimensionsInMeters(); _properties.setDimensions(oldDimensionsInMeters); if (_wantDebug) { @@ -68,7 +68,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, } if (!_properties.containsPositionChange() && _properties.containsDimensionsChange()) { - glm::vec3 oldPositionInMeters = _existingEntity->getPosition() * (float)TREE_SCALE; + glm::vec3 oldPositionInMeters = _existingEntity->getPositionInMeters(); _properties.setPosition(oldPositionInMeters); if (_wantDebug) { From 8d4ea143ce34df18cd7f29cd2a855a659f71642a Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 25 Feb 2015 14:48:06 -0800 Subject: [PATCH 02/28] easy conversions of: InDomainUnits --> InMeters --- interface/src/avatar/ModelReferential.cpp | 4 ++-- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 6 +++--- libraries/entities-renderer/src/RenderableBoxEntityItem.cpp | 4 ++-- .../entities-renderer/src/RenderableLightEntityItem.cpp | 2 +- .../entities-renderer/src/RenderableModelEntityItem.cpp | 4 ++-- .../entities-renderer/src/RenderableSphereEntityItem.cpp | 2 +- .../entities-renderer/src/RenderableTextEntityItem.cpp | 2 +- libraries/entities/src/ModelEntityItem.cpp | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index 9136e53fa5..952d6475dc 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -34,7 +34,7 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A if (item != NULL) { _refScale = item->getLargestDimensionInDomainUnits(); _refRotation = item->getRotation(); - _refPosition = item->getPositionInDomainUnits() * (float)TREE_SCALE; + _refPosition = item->getPositionInMeters(); update(); } } @@ -53,7 +53,7 @@ ModelReferential::ModelReferential(const QUuid& entityID, EntityTree* tree, Avat _refScale = item->getLargestDimensionInDomainUnits(); _refRotation = item->getRotation(); - _refPosition = item->getPositionInDomainUnits() * (float)TREE_SCALE; + _refPosition = item->getPositionInMeters(); glm::quat refInvRot = glm::inverse(_refRotation); _scale = _avatar->getTargetScale() / _refScale; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index ca69c2255a..d784950267 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -501,9 +501,9 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glPopMatrix(); - glm::vec3 position = entity->getPositionInDomainUnits() * (float) TREE_SCALE; - glm::vec3 center = entity->getCenterInDomainUnits() * (float) TREE_SCALE; - glm::vec3 dimensions = entity->getDimensionsInDomainUnits() * (float) TREE_SCALE; + glm::vec3 position = entity->getPositionInMeters(); + glm::vec3 center = entity->getCenterInMeters(); + glm::vec3 dimensions = entity->getDimensionsInMeters(); glm::quat rotation = entity->getRotation(); glPushMatrix(); diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index fe3375c274..a80fc91995 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -26,8 +26,8 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableBoxEntityItem::render"); assert(getType() == EntityTypes::Box); glm::vec3 position = getPositionInMeters(); - glm::vec3 center = getCenterInDomainUnits() * (float)TREE_SCALE; - glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; + glm::vec3 center = getCenterInMeters(); + glm::vec3 dimensions = getDimensionsInMeters(); glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 5b1486a6e4..5a20633044 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -27,7 +27,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLightEntityItem::render"); assert(getType() == EntityTypes::Light); glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInMeters(); glm::quat rotation = getRotation(); float largestDiameter = glm::max(dimensions.x, dimensions.y, dimensions.z); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index cf09d84895..b7ea64ebef 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -114,9 +114,9 @@ void RenderableModelEntityItem::render(RenderArgs* args) { bool drawAsModel = hasModel(); - glm::vec3 position = getPositionInDomainUnits() * (float)TREE_SCALE; + glm::vec3 position = getPositionInMeters(); float size = getSize() * (float)TREE_SCALE; - glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInMeters(); if (drawAsModel) { remapTextures(); diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index fd0137812d..4688e7cc29 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -28,7 +28,7 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { assert(getType() == EntityTypes::Sphere); glm::vec3 position = getPositionInMeters(); glm::vec3 center = getCenterInMeters(); - glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInMeters(); glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index c45096358b..097aef3b38 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -31,7 +31,7 @@ void RenderableTextEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableTextEntityItem::render"); assert(getType() == EntityTypes::Text); glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensionsInDomainUnits() * (float)TREE_SCALE; + glm::vec3 dimensions = getDimensionsInMeters(); glm::vec3 halfDimensions = dimensions / 2.0f; glm::quat rotation = getRotation(); float leftMargin = 0.1f; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 61613a2ec8..5a95fe4e33 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -255,8 +255,8 @@ void ModelEntityItem::update(const quint64& now) { void ModelEntityItem::debugDump() const { qDebug() << "ModelEntityItem id:" << getEntityItemID(); qDebug() << " edited ago:" << getEditedAgo(); - qDebug() << " position:" << getPositionInDomainUnits() * (float)TREE_SCALE; - qDebug() << " dimensions:" << getDimensionsInDomainUnits() * (float)TREE_SCALE; + qDebug() << " position:" << getPositionInMeters(); + qDebug() << " dimensions:" << getDimensionsInMeters(); qDebug() << " model URL:" << getModelURL(); } From 9ad88c379317ec3c517a9c3b3d2224d374a7b9d8 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Feb 2015 13:42:08 -0800 Subject: [PATCH 03/28] Referentials do math using meters --- interface/src/avatar/ModelReferential.cpp | 42 ++++++++++------------- libraries/avatars/src/Referential.cpp | 2 -- libraries/avatars/src/Referential.h | 14 ++++---- 3 files changed, 25 insertions(+), 33 deletions(-) diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index 952d6475dc..beb378403d 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -21,7 +21,6 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A { _translation = referential->getTranslation(); _rotation = referential->getRotation(); - _scale = referential->getScale(); unpackExtraData(reinterpret_cast(referential->getExtraData().data()), referential->getExtraData().size()); @@ -32,7 +31,7 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); if (item != NULL) { - _refScale = item->getLargestDimensionInDomainUnits(); + _lastRefDimension = item->getDimensionsInMeters(); _refRotation = item->getRotation(); _refPosition = item->getPositionInMeters(); update(); @@ -51,14 +50,13 @@ ModelReferential::ModelReferential(const QUuid& entityID, EntityTree* tree, Avat return; } - _refScale = item->getLargestDimensionInDomainUnits(); + _lastRefDimension = item->getDimensionsInMeters(); _refRotation = item->getRotation(); _refPosition = item->getPositionInMeters(); glm::quat refInvRot = glm::inverse(_refRotation); - _scale = _avatar->getTargetScale() / _refScale; _rotation = refInvRot * _avatar->getOrientation(); - _translation = refInvRot * (avatar->getPosition() - _refPosition) / _refScale; + _translation = refInvRot * (avatar->getPosition() - _refPosition); } void ModelReferential::update() { @@ -68,9 +66,10 @@ void ModelReferential::update() { } bool somethingChanged = false; - if (item->getLargestDimensionInDomainUnits() != _refScale) { - _refScale = item->getLargestDimensionInDomainUnits(); - _avatar->setTargetScale(_refScale * _scale, true); + if (item->getDimensionsInMeters() != _lastRefDimension) { + glm::vec3 oldDimension = _lastRefDimension; + _lastRefDimension = item->getDimensionsInMeters(); + _translation *= _lastRefDimension / oldDimension; somethingChanged = true; } if (item->getRotation() != _refRotation) { @@ -78,9 +77,9 @@ void ModelReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) { - _refPosition = item->getPositionInDomainUnits(); - _avatar->setPosition(_refPosition * (float)TREE_SCALE + _refRotation * (_translation * _refScale), true); + if (item->getPositionInMeters() != _refPosition || somethingChanged) { + _refPosition = item->getPositionInMeters(); + _avatar->setPosition(_refPosition + _refRotation * _translation, true); } } @@ -108,7 +107,7 @@ JointReferential::JointReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) { - _refScale = item->getLargestDimensionInDomainUnits(); + _lastRefDimension = item->getDimensionsInMeters(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); } @@ -119,7 +118,6 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E ModelReferential(entityID, tree, avatar), _jointIndex(jointIndex) { - // TODO: Andrew to fix this using meters _type = JOINT; const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); @@ -129,19 +127,17 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E return; } - _refScale = item->getLargestDimensionInDomainUnits(); + _lastRefDimension = item->getDimensionsInMeters(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); glm::quat refInvRot = glm::inverse(_refRotation); - _scale = _avatar->getTargetScale() / _refScale; _rotation = refInvRot * _avatar->getOrientation(); // BUG! _refPosition is in domain units, but avatar is in meters - _translation = refInvRot * (avatar->getPosition() - _refPosition) / _refScale; + _translation = refInvRot * (avatar->getPosition() - _refPosition); } void JointReferential::update() { - // TODO: Andrew to fix this using meters const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) { @@ -149,9 +145,10 @@ void JointReferential::update() { } bool somethingChanged = false; - if (item->getLargestDimensionInDomainUnits() != _refScale) { - _refScale = item->getLargestDimensionInDomainUnits(); - _avatar->setTargetScale(_refScale * _scale, true); + if (item->getDimensionsInMeters() != _lastRefDimension) { + glm::vec3 oldDimension = _lastRefDimension; + _lastRefDimension = item->getDimensionsInMeters(); + _translation *= _lastRefDimension / oldDimension; somethingChanged = true; } if (item->getRotation() != _refRotation) { @@ -159,10 +156,9 @@ void JointReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) { + if (item->getPositionInMeters() != _refPosition || somethingChanged) { model->getJointPositionInWorldFrame(_jointIndex, _refPosition); - // BUG! _refPosition is in domain units, but avatar is in meters - _avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale), true); + _avatar->setPosition(_refPosition + _refRotation * _translation, true); } } diff --git a/libraries/avatars/src/Referential.cpp b/libraries/avatars/src/Referential.cpp index d5203a0a9d..f5f1d47324 100644 --- a/libraries/avatars/src/Referential.cpp +++ b/libraries/avatars/src/Referential.cpp @@ -76,7 +76,6 @@ int Referential::pack(unsigned char* destinationBuffer) const { destinationBuffer += packFloatVec3ToSignedTwoByteFixed(destinationBuffer, _translation, 0); destinationBuffer += packOrientationQuatToBytes(destinationBuffer, _rotation); - destinationBuffer += packFloatScalarToSignedTwoByteFixed(destinationBuffer, _scale, 0); return destinationBuffer - startPosition; } @@ -91,7 +90,6 @@ int Referential::unpack(const unsigned char* sourceBuffer) { sourceBuffer += unpackFloatVec3FromSignedTwoByteFixed(sourceBuffer, _translation, 0); sourceBuffer += unpackOrientationQuatFromBytes(sourceBuffer, _rotation); - sourceBuffer += unpackFloatScalarFromSignedTwoByteFixed((const int16_t*) sourceBuffer, &_scale, 0); return sourceBuffer - startPosition; } diff --git a/libraries/avatars/src/Referential.h b/libraries/avatars/src/Referential.h index d824cad42b..70edecda62 100644 --- a/libraries/avatars/src/Referential.h +++ b/libraries/avatars/src/Referential.h @@ -39,7 +39,6 @@ public: glm::vec3 getTranslation() const { return _translation; } glm::quat getRotation() const { return _rotation; } - float getScale() const {return _scale; } QByteArray getExtraData() const { return _extraDataBuffer; } virtual void update() {} @@ -62,14 +61,13 @@ protected: AvatarData* _avatar; QByteArray _extraDataBuffer; - glm::vec3 _refPosition; - glm::quat _refRotation; - float _refScale; + glm::vec3 _refPosition; // position of object in world-frame + glm::quat _refRotation; // rotation of object in world-frame + glm::vec3 _lastRefDimension; // dimension of object when _translation was last computed - glm::vec3 _translation; - glm::quat _rotation; - float _scale; + glm::vec3 _translation; // offset of avatar in object local-frame + glm::quat _rotation; // rotation of avatar in object local-frame }; -#endif // hifi_Referential_h \ No newline at end of file +#endif // hifi_Referential_h From 93c77d557aa995f95972ea36d7e839e60d0fa33e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Feb 2015 14:14:17 -0800 Subject: [PATCH 04/28] EntityTree::findClosestEntity() now takes meters --- .../entities/src/EntityScriptingInterface.cpp | 3 +- libraries/entities/src/EntityTree.cpp | 3 +- libraries/entities/src/EntityTree.h | 2 + libraries/octree/src/ViewFrustum.h | 5 +-- tests/octree/src/ModelTests.cpp | 40 ++++++++----------- 5 files changed, 24 insertions(+), 29 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 0ee2e243f9..8e152f375d 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -180,8 +180,7 @@ EntityItemID EntityScriptingInterface::findClosestEntity(const glm::vec3& center EntityItemID result(UNKNOWN_ENTITY_ID, UNKNOWN_ENTITY_TOKEN, false); if (_entityTree) { _entityTree->lockForRead(); - const EntityItem* closestEntity = _entityTree->findClosestEntity(center/(float)TREE_SCALE, - radius/(float)TREE_SCALE); + const EntityItem* closestEntity = _entityTree->findClosestEntity(center, radius); _entityTree->unlock(); if (closestEntity) { result.id = closestEntity->getID(); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 68e220acbe..1e915bdd0f 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -456,7 +456,8 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) } const EntityItem* EntityTree::findClosestEntity(glm::vec3 position, float targetRadius) { - FindNearPointArgs args = { position, targetRadius, false, NULL, FLT_MAX }; + // position and targetRadius are in meters, so we need to convert to TreeUnits in FindNearPointArgs + FindNearPointArgs args = { position / (float)TREE_SCALE, targetRadius / (float)TREE_SCALE, false, NULL, FLT_MAX }; lockForRead(); // NOTE: This should use recursion, since this is a spatial operation recurseTreeWithOperation(findNearPointOperation, &args); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index d8b9b9f38f..d85474cb33 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -95,6 +95,8 @@ public: void deleteEntities(QSet entityIDs, bool force = false); void removeEntityFromSimulation(EntityItem* entity); + /// \param position point of query in world-frame (meters) + /// \param targetRadius radius of query (meters) const EntityItem* findClosestEntity(glm::vec3 position, float targetRadius); EntityItem* findEntityByID(const QUuid& id); EntityItem* findEntityByEntityItemID(const EntityItemID& entityID); diff --git a/libraries/octree/src/ViewFrustum.h b/libraries/octree/src/ViewFrustum.h index c40bc37652..3f7921f9b7 100644 --- a/libraries/octree/src/ViewFrustum.h +++ b/libraries/octree/src/ViewFrustum.h @@ -30,7 +30,7 @@ const float DEFAULT_KEYHOLE_RADIUS = 3.0f; const float DEFAULT_FIELD_OF_VIEW_DEGREES = 45.0f; const float DEFAULT_ASPECT_RATIO = 16.0f/9.0f; const float DEFAULT_NEAR_CLIP = 0.08f; -const float DEFAULT_FAR_CLIP = TREE_SCALE; +const float DEFAULT_FAR_CLIP = (float)TREE_SCALE; class ViewFrustum { public: @@ -119,7 +119,6 @@ public: OctreeProjectedPolygon getProjectedPolygon(const AACube& box) const; void getFurthestPointFromCamera(const AACube& box, glm::vec3& furthestPoint) const; - // assumes box is in voxel scale, not TREE_SCALE, will scale view frustum's position accordingly void getFurthestPointFromCameraVoxelScale(const AACube& box, glm::vec3& furthestPoint) const; float distanceToCamera(const glm::vec3& point) const; @@ -134,7 +133,7 @@ private: void calculateOrthographic(); // camera location/orientation attributes - glm::vec3 _position = glm::vec3(0.0f); // the position in TREE_SCALE + glm::vec3 _position = glm::vec3(0.0f); // the position in world-frame glm::vec3 _positionVoxelScale = glm::vec3(0.0f); // the position in voxel scale glm::quat _orientation = glm::quat(); diff --git a/tests/octree/src/ModelTests.cpp b/tests/octree/src/ModelTests.cpp index 00cb3901e5..e46fbc157a 100644 --- a/tests/octree/src/ModelTests.cpp +++ b/tests/octree/src/ModelTests.cpp @@ -45,12 +45,9 @@ void EntityTests::entityTreeTests(bool verbose) { entityID.isKnownID = false; // this is a temporary workaround to allow local tree entities to be added with known IDs EntityItemProperties properties; float oneMeter = 1.0f; - //float halfMeter = oneMeter / 2.0f; float halfOfDomain = TREE_SCALE * 0.5f; - glm::vec3 positionNearOriginInMeters(oneMeter, oneMeter, oneMeter); // when using properties, these are in meter not tree units - glm::vec3 positionAtCenterInMeters(halfOfDomain, halfOfDomain, halfOfDomain); - glm::vec3 positionNearOriginInTreeUnits = positionNearOriginInMeters / (float)TREE_SCALE; - glm::vec3 positionAtCenterInTreeUnits = positionAtCenterInMeters / (float)TREE_SCALE; + glm::vec3 positionNearOrigin(oneMeter, oneMeter, oneMeter); // when using properties, these are in meter not tree units + glm::vec3 positionAtCenter(halfOfDomain, halfOfDomain, halfOfDomain); { testsTaken++; @@ -59,15 +56,14 @@ void EntityTests::entityTreeTests(bool verbose) { qDebug() << "Test" << testsTaken <<":" << qPrintable(testName); } - properties.setPosition(positionAtCenterInMeters); + properties.setPosition(positionAtCenter); // TODO: Fix these unit tests. - //properties.setRadius(halfMeter); //properties.setModelURL("http://s3.amazonaws.com/hifi-public/ozan/theater.fbx"); tree.addEntity(entityID, properties); - float targetRadius = oneMeter * 2.0 / (float)TREE_SCALE; // in tree units - const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenterInTreeUnits, targetRadius); + float targetRadius = oneMeter * 2.0f; + const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenter, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); @@ -103,14 +99,14 @@ void EntityTests::entityTreeTests(bool verbose) { qDebug() << "Test" << testsTaken <<":" << qPrintable(testName); } - glm::vec3 newPosition = positionNearOriginInMeters; + glm::vec3 newPosition = positionNearOrigin; properties.setPosition(newPosition); tree.updateEntity(entityID, properties, true); - float targetRadius = oneMeter * 2.0 / (float)TREE_SCALE; // in tree units - const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionNearOriginInTreeUnits, targetRadius); + float targetRadius = oneMeter * 2.0f; + const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionNearOrigin, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); @@ -143,14 +139,14 @@ void EntityTests::entityTreeTests(bool verbose) { qDebug() << "Test" << testsTaken <<":" << qPrintable(testName); } - glm::vec3 newPosition = positionAtCenterInMeters; + glm::vec3 newPosition = positionAtCenter; properties.setPosition(newPosition); tree.updateEntity(entityID, properties, true); - float targetRadius = oneMeter * 2.0 / (float)TREE_SCALE; // in tree units - const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenterInTreeUnits, targetRadius); + float targetRadius = oneMeter * 2.0f; + const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenter, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); @@ -184,11 +180,11 @@ void EntityTests::entityTreeTests(bool verbose) { qDebug() << "Test" << testsTaken <<":" << qPrintable(testName); } - float targetRadius = oneMeter * 2.0 / (float)TREE_SCALE; // in tree units + float targetRadius = oneMeter * 2.0f; quint64 start = usecTimestampNow(); const EntityItem* foundEntityByRadius = NULL; for (int i = 0; i < TEST_ITERATIONS; i++) { - foundEntityByRadius = tree.findClosestEntity(positionAtCenterInTreeUnits, targetRadius); + foundEntityByRadius = tree.findClosestEntity(positionAtCenter, targetRadius); } quint64 end = usecTimestampNow(); @@ -262,13 +258,11 @@ void EntityTests::entityTreeTests(bool verbose) { float randomX = randFloatInRange(1.0f ,(float)TREE_SCALE - 1.0f); float randomY = randFloatInRange(1.0f ,(float)TREE_SCALE - 1.0f); float randomZ = randFloatInRange(1.0f ,(float)TREE_SCALE - 1.0f); - glm::vec3 randomPositionInMeters(randomX,randomY,randomZ); - glm::vec3 randomPositionInTreeUnits = randomPositionInMeters / (float)TREE_SCALE; + glm::vec3 randomPosition(randomX,randomY,randomZ); - properties.setPosition(randomPositionInMeters); + properties.setPosition(randomPosition); // TODO: fix these unit tests - //properties.setRadius(halfMeter); //properties.setModelURL("http://s3.amazonaws.com/hifi-public/ozan/theater.fbx"); if (extraVerbose) { @@ -287,8 +281,8 @@ void EntityTests::entityTreeTests(bool verbose) { } quint64 startFind = usecTimestampNow(); - float targetRadius = oneMeter * 2.0 / (float)TREE_SCALE; // in tree units - const EntityItem* foundEntityByRadius = tree.findClosestEntity(randomPositionInTreeUnits, targetRadius); + float targetRadius = oneMeter * 2.0f; + const EntityItem* foundEntityByRadius = tree.findClosestEntity(randomPosition, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); quint64 endFind = usecTimestampNow(); totalElapsedFind += (endFind - startFind); From 7210c7a88bc6fcfb9f6edc0a9dacc41c130ef5b0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Feb 2015 15:16:59 -0800 Subject: [PATCH 05/28] added EntityTree::findEntitiesInMeters() progress toward conversion to meters --- .../src/EntityTreeRenderer.cpp | 12 +++---- libraries/entities/src/EntityItem.cpp | 6 ++++ libraries/entities/src/EntityItem.h | 2 ++ .../entities/src/EntityScriptingInterface.cpp | 2 +- libraries/entities/src/EntityTree.cpp | 5 +-- libraries/entities/src/EntityTree.h | 6 ++-- libraries/shared/src/AABox.cpp | 34 +++++++++++-------- libraries/shared/src/AABox.h | 8 +++-- 8 files changed, 46 insertions(+), 29 deletions(-) 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: From 64c28fe925061a924da6d3258e4c4088e67fa15d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Feb 2015 15:36:59 -0800 Subject: [PATCH 06/28] remove EntityItem::getSize() --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 5 ----- libraries/entities/src/EntityItem.h | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index b7ea64ebef..5f2c0baa5f 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -115,8 +115,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { bool drawAsModel = hasModel(); glm::vec3 position = getPositionInMeters(); - float size = getSize() * (float)TREE_SCALE; glm::vec3 dimensions = getDimensionsInMeters(); + float size = glm::length(dimensions); if (drawAsModel) { remapTextures(); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index b24925dd6c..ee314d514f 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -888,11 +888,6 @@ void EntityItem::recordCreationTime() { } -// TODO: is this really correct? how do we use size, does it need to handle rotation? -float EntityItem::getSize() const { - return glm::length(_dimensions); -} - // TODO: doesn't this need to handle rotation? glm::vec3 EntityItem::getCenterInDomainUnits() const { return _position + (_dimensions * (glm::vec3(0.5f,0.5f,0.5f) - _registrationPoint)); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 1aad9c27e0..09a2c7bc6b 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -212,7 +212,6 @@ public: quint64 getExpiry() const; // position, size, and bounds related helpers - 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) From 7836bb4dcd8ca0436a108b8de6b419b383a5f87d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Feb 2015 17:42:17 -0800 Subject: [PATCH 07/28] rayIntersection uses meters instead of tree units --- .../src/RenderableLightEntityItem.cpp | 2 +- .../src/RenderableLightEntityItem.h | 2 +- .../src/RenderableModelEntityItem.cpp | 19 +++---------------- .../src/RenderableModelEntityItem.h | 2 +- libraries/entities/src/EntityItem.h | 2 +- libraries/entities/src/EntityTreeElement.cpp | 10 +++++----- libraries/entities/src/EntityTreeElement.h | 2 +- libraries/entities/src/SphereEntityItem.cpp | 6 +++--- libraries/entities/src/SphereEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 8 ++++---- libraries/entities/src/TextEntityItem.h | 2 +- libraries/octree/src/Octree.cpp | 6 +----- libraries/octree/src/OctreeElement.cpp | 4 +--- libraries/shared/src/AACube.h | 8 ++++++++ 14 files changed, 32 insertions(+), 43 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 5a20633044..ab6445cc6e 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -80,7 +80,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { #endif }; -bool RenderableLightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, +bool RenderableLightEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.h b/libraries/entities-renderer/src/RenderableLightEntityItem.h index cfafb85983..1ea3e7e884 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.h @@ -24,7 +24,7 @@ public: virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 5f2c0baa5f..6c1d24b845 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -254,29 +254,16 @@ EntityItemProperties RenderableModelEntityItem::getProperties() const { return properties; } -bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, +bool RenderableModelEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { if (!_model) { return true; } + //qDebug() << "RenderableModelEntityItem::findDetailedRayIntersectionInMeters() precisionPicking:" << precisionPicking; - glm::vec3 originInMeters = origin * (float)TREE_SCALE; QString extraInfo; - float localDistance; - - //qDebug() << "RenderableModelEntityItem::findDetailedRayIntersection() precisionPicking:" << precisionPicking; - - bool intersectsModel = _model->findRayIntersectionAgainstSubMeshes(originInMeters, direction, - localDistance, face, extraInfo, precisionPicking); - - if (intersectsModel) { - // NOTE: findRayIntersectionAgainstSubMeshes() does work in meters, but we're expected to return - // results in tree scale. - distance = localDistance / (float)TREE_SCALE; - } - - return intersectsModel; // we only got here if we intersected our non-aabox + return _model->findRayIntersectionAgainstSubMeshes(origin, direction, distance, face, extraInfo, precisionPicking); } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 65cded0207..7e20b0bd15 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -44,7 +44,7 @@ public: virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 09a2c7bc6b..64fe712e43 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -139,7 +139,7 @@ public: virtual void debugDump() const; virtual bool supportsDetailedRayIntersection() const { return false; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { return true; } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 4b4bae662a..abdc7c4768 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -469,7 +469,7 @@ bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3 return false; } -bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, +bool EntityTreeElement::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { @@ -485,7 +485,7 @@ bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, con while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - AABox entityBox = entity->getAABox(); + AABox entityBox = entity->getAABoxInMeters(); float localDistance; BoxFace localFace; @@ -494,11 +494,11 @@ bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, con // extents is the entity relative, scaled, centered extents of the entity glm::mat4 rotation = glm::mat4_cast(entity->getRotation()); - glm::mat4 translation = glm::translate(entity->getPositionInDomainUnits()); + glm::mat4 translation = glm::translate(entity->getPositionInMeters()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = entity->getDimensionsInDomainUnits(); + glm::vec3 dimensions = entity->getDimensionsInMeters(); glm::vec3 registrationPoint = entity->getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); @@ -513,7 +513,7 @@ bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, con if (localDistance < distance) { // now ask the entity if we actually intersect if (entity->supportsDetailedRayIntersection()) { - if (entity->findDetailedRayIntersection(origin, direction, keepSearching, element, localDistance, + if (entity->findDetailedRayIntersectionInMeters(origin, direction, keepSearching, element, localDistance, localFace, intersectedObject, precisionPicking)) { if (localDistance < distance) { diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index 0b28dd30d0..424e3ca520 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -135,7 +135,7 @@ public: virtual bool deleteApproved() const { return !hasEntities(); } virtual bool canRayIntersect() const { return hasEntities(); } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking, float distanceToElementCube); diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 6b773d8189..75788c979f 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -94,13 +94,13 @@ void SphereEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBi APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); } -bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, +bool SphereEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { // determine the ray in the frame of the entity transformed from a unit sphere - glm::mat4 translation = glm::translate(getPositionInDomainUnits()); + glm::mat4 translation = glm::translate(getPositionInMeters()); glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 scale = glm::scale(getDimensionsInDomainUnits()); + glm::mat4 scale = glm::scale(getDimensionsInMeters()); glm::mat4 registration = glm::translate(glm::vec3(0.5f, 0.5f, 0.5f) - getRegistrationPoint()); glm::mat4 entityToWorldMatrix = translation * rotation * scale * registration; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index f79a2db7ff..f8419e75b9 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -56,7 +56,7 @@ public: virtual ShapeType getShapeType() const { return SHAPE_TYPE_SPHERE; } virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 051463929c..a716bba0e2 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -122,7 +122,7 @@ void TextEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits } -bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, +bool TextEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { @@ -136,7 +136,7 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const const glm::vec3 UNROTATED_NORMAL(0.0f, 0.0f, -1.0f); glm::vec3 normal = _rotation * UNROTATED_NORMAL; plane.setNormal(normal); - plane.setPoint(_position); // the position is definitely a point on our plane + plane.setPoint(getPositionInMeters()); // the position is definitely a point on our plane bool intersects = plane.findRayIntersection(rayInfo); @@ -145,11 +145,11 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const // now we know the point the ray hit our plane glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 translation = glm::translate(getPositionInDomainUnits()); + glm::mat4 translation = glm::translate(getPositionInMeters()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = getDimensionsInDomainUnits(); + glm::vec3 dimensions = getDimensionsInMeters(); glm::vec3 registrationPoint = getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); AABox entityFrameBox(corner, dimensions); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 5804c9af1e..60f82f4936 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -46,7 +46,7 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index e925ea5aba..4a57b8047f 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -706,7 +706,7 @@ bool findRayIntersectionOp(OctreeElement* element, void* extraData) { bool Octree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, Octree::lockType lockType, bool* accurateResult, bool precisionPicking) { - RayArgs args = { origin / (float)(TREE_SCALE), direction, element, distance, face, + RayArgs args = { origin, direction, element, distance, face, intersectedObject, false, precisionPicking}; distance = FLT_MAX; @@ -726,10 +726,6 @@ bool Octree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direc recurseTreeWithOperation(findRayIntersectionOp, &args); - if (args.found) { - args.distance *= (float)(TREE_SCALE); // scale back up to meters - } - if (gotLock) { unlock(); } diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 93792678e2..b686796b9d 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -1338,13 +1338,11 @@ bool OctreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3 keepSearching = true; // assume that we will continue searching after this. AACube cube = getAACube(); + cube *= (float)TREE_SCALE; float distanceToElementCube = std::numeric_limits::max(); float distanceToElementDetails = distance; BoxFace localFace; - AACube debugCube = cube; - debugCube.scale((float)TREE_SCALE); - // if the ray doesn't intersect with our cube, we can stop searching! if (!cube.findRayIntersection(origin, direction, distanceToElementCube, localFace)) { keepSearching = false; // no point in continuing to search diff --git a/libraries/shared/src/AACube.h b/libraries/shared/src/AACube.h index b29bc49bef..5bcf9527cf 100644 --- a/libraries/shared/src/AACube.h +++ b/libraries/shared/src/AACube.h @@ -63,6 +63,8 @@ public: AABox clamp(const glm::vec3& min, const glm::vec3& max) const; AABox clamp(float min, float max) const; + AACube& operator *= (float scale); + private: glm::vec3 getClosestPointOnFace(const glm::vec3& point, BoxFace face) const; glm::vec3 getClosestPointOnFace(const glm::vec4& origin, const glm::vec4& direction, BoxFace face) const; @@ -74,6 +76,12 @@ private: float _scale; }; +inline AACube& AACube::operator *= (float scale) { + _corner *= scale; + _scale *= scale; + return *this; +} + inline bool operator==(const AACube& a, const AACube& b) { return a.getCorner() == b.getCorner() && a.getScale() == b.getScale(); } From e1954d3e1dee87ac29aa52ec24ceab9f5cb1d17e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Sun, 1 Mar 2015 15:19:26 -0800 Subject: [PATCH 08/28] spherical queries into Octree use meters --- libraries/entities/src/EntityTree.cpp | 7 ++++--- libraries/entities/src/EntityTree.h | 2 +- libraries/octree/src/Octree.cpp | 11 +++++++---- libraries/octree/src/OctreeElement.cpp | 5 ++++- libraries/octree/src/OctreeElement.h | 4 ++++ 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 1c820564f0..4c1963088c 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -476,8 +476,9 @@ public: bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) { FindAllNearPointArgs* args = static_cast(extraData); glm::vec3 penetration; - bool sphereIntersection = element->getAACube().findSpherePenetration(args->position, - args->targetRadius, penetration); + AACube cube = element->getAACube(); + cube *= (float)TREE_SCALE; + bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); // If this element contains the point, then search it... if (sphereIntersection) { @@ -493,7 +494,7 @@ bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) // NOTE: assumes caller has handled locking 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 }; + FindAllNearPointArgs args = { center, radius }; // 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 e748df2548..f8a8262afd 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -169,7 +169,7 @@ private: bool updateEntityWithElement(EntityItem* entity, const EntityItemProperties& properties, EntityTreeElement* containingElement, bool allowLockChange); static bool findNearPointOperation(OctreeElement* element, void* extraData); - static bool findInSphereOperation(OctreeElement* element, void* extraData); + static bool findInSphereOperationInMeters(OctreeElement* element, void* extraData); static bool findInCubeOperation(OctreeElement* element, void* extraData); static bool sendEntitiesOperation(OctreeElement* element, void* extraData); diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 4a57b8047f..a1df449135 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -748,8 +748,11 @@ public: bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { SphereArgs* args = static_cast(extraData); + // the details in args is in meters (world-frame) so we have to scale the element cube up + AACube box = element->getAACube(); + box *= (float)TREE_SCALE; + // coarse check against bounds - const AACube& box = element->getAACube(); if (!box.expandedContains(args->center, args->radius)) { return false; } @@ -758,7 +761,7 @@ bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { if (element->findSpherePenetration(args->center, args->radius, elementPenetration, &args->penetratedObject)) { // NOTE: it is possible for this penetration accumulation algorithm to produce a // final penetration vector with zero length. - args->penetration = addPenetrations(args->penetration, elementPenetration * (float)(TREE_SCALE)); + args->penetration = addPenetrations(args->penetration, elementPenetration); args->found = true; } } @@ -772,8 +775,8 @@ bool Octree::findSpherePenetration(const glm::vec3& center, float radius, glm::v void** penetratedObject, Octree::lockType lockType, bool* accurateResult) { SphereArgs args = { - center / (float)(TREE_SCALE), - radius / (float)(TREE_SCALE), + center, + radius, penetration, false, NULL }; diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index b686796b9d..954d0b7847 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -1390,7 +1390,10 @@ bool OctreeElement::findDetailedRayIntersection(const glm::vec3& origin, const g bool OctreeElement::findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const { - return _cube.findSpherePenetration(center, radius, penetration); + // center and radius are in meters, so we have to scale the _cube into world-frame + AACube cube = _cube; + cube *= (float)TREE_SCALE; + return cube.findSpherePenetration(center, radius, penetration); } // TODO: consider removing this, or switching to using getOrCreateChildElementContaining(const AACube& box)... diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 8c83d9976e..e2229b2214 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -125,6 +125,10 @@ public: bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking, float distanceToElementCube); + /// \param center center of sphere in meters + /// \param radius radius of sphere in meters + /// \param[out] penetration pointing into cube from sphere + /// \param penetratedObject unused virtual bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const; From c2e78931c6c588ef54df09d78489ddb772255058 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Sun, 1 Mar 2015 15:21:01 -0800 Subject: [PATCH 09/28] revert namechange: use compiler find all instances --- libraries/entities/src/EntityTree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index f8a8262afd..e748df2548 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -169,7 +169,7 @@ private: bool updateEntityWithElement(EntityItem* entity, const EntityItemProperties& properties, EntityTreeElement* containingElement, bool allowLockChange); static bool findNearPointOperation(OctreeElement* element, void* extraData); - static bool findInSphereOperationInMeters(OctreeElement* element, void* extraData); + static bool findInSphereOperation(OctreeElement* element, void* extraData); static bool findInCubeOperation(OctreeElement* element, void* extraData); static bool sendEntitiesOperation(OctreeElement* element, void* extraData); From 90b69b1ee00aa2fd38faf17625bb352b34e213c8 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Sun, 1 Mar 2015 15:58:10 -0800 Subject: [PATCH 10/28] replace some "InDomainUnits" calls with "InMeters" --- libraries/entities/src/EntityItem.cpp | 4 ++-- libraries/entities/src/EntityItem.h | 4 ++-- libraries/entities/src/EntityTree.cpp | 9 +++++---- libraries/entities/src/EntityTreeElement.cpp | 14 +++++++------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index ee314d514f..8aed4b5a4d 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -992,8 +992,8 @@ void EntityItem::setRadius(float value) { // ... radius = cornerToCornerLength / 2.0f // ... cornerToCornerLength = sqrt(3 x maxDimension ^ 2) // ... radius = sqrt(3 x maxDimension ^ 2) / 2.0f; -float EntityItem::getRadius() const { - float length = glm::length(_dimensions); +float EntityItem::getRadiusInMeters() const { + float length = glm::length(_dimensions) * (float)TREE_SCALE; float radius = length / 2.0f; return radius; } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 64fe712e43..662bde216a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -250,8 +250,8 @@ public: const QString& getUserData() const { return _userData; } void setUserData(const QString& value) { _userData = value; } - // TODO: We need to get rid of these users of getRadius()... - float getRadius() const; + // TODO: get rid of users of getRadius()... + float getRadiusInMeters() 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); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 4c1963088c..aef5b1d2bf 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -424,8 +424,9 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) EntityTreeElement* entityTreeElement = static_cast(element); glm::vec3 penetration; - bool sphereIntersection = entityTreeElement->getAACube().findSpherePenetration(args->position, - args->targetRadius, penetration); + AACube cube = entityTreeElement->getAACube(); + cube *= (float)TREE_SCALE; + bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); // If this entityTreeElement contains the point, then search it... if (sphereIntersection) { @@ -433,7 +434,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) // we may have gotten NULL back, meaning no entity was available if (thisClosestEntity) { - glm::vec3 entityPosition = thisClosestEntity->getPositionInDomainUnits(); + glm::vec3 entityPosition = thisClosestEntity->getPositionInMeters(); float distanceFromPointToEntity = glm::distance(entityPosition, args->position); // If we're within our target radius @@ -457,7 +458,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) const EntityItem* EntityTree::findClosestEntity(glm::vec3 position, float targetRadius) { // position and targetRadius are in meters, so we need to convert to TreeUnits in FindNearPointArgs - FindNearPointArgs args = { position / (float)TREE_SCALE, targetRadius / (float)TREE_SCALE, false, NULL, FLT_MAX }; + FindNearPointArgs args = { position, targetRadius, false, NULL, FLT_MAX }; lockForRead(); // NOTE: This should use recursion, since this is a spatial operation recurseTreeWithOperation(findNearPointOperation, &args); diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index abdc7c4768..f746a03054 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -549,8 +549,8 @@ bool EntityTreeElement::findSpherePenetration(const glm::vec3& center, float rad QList::const_iterator entityEnd = _entityItems->end(); while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - glm::vec3 entityCenter = entity->getPositionInDomainUnits(); - float entityRadius = entity->getRadius(); + glm::vec3 entityCenter = entity->getPositionInMeters(); + float entityRadius = entity->getRadiusInMeters(); // don't penetrate yourself if (entityCenter == center && entityRadius == radius) { @@ -585,7 +585,7 @@ const EntityItem* EntityTreeElement::getClosestEntity(glm::vec3 position) const float closestEntityDistance = FLT_MAX; uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { - float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPositionInDomainUnits()); + float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPositionInMeters()); if (distanceToEntity < closestEntityDistance) { closestEntity = (*_entityItems)[i]; } @@ -598,8 +598,8 @@ void EntityTreeElement::getEntities(const glm::vec3& searchPosition, float searc uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { const EntityItem* entity = (*_entityItems)[i]; - float distance = glm::length(entity->getPositionInDomainUnits() - searchPosition); - if (distance < searchRadius + entity->getRadius()) { + float distance = glm::length(entity->getPositionInMeters() - searchPosition); + if (distance < searchRadius + entity->getRadiusInMeters()) { foundEntities.push_back(entity); } } @@ -612,11 +612,11 @@ void EntityTreeElement::getEntities(const AACube& box, QVector& fou AACube entityCube; while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - float radius = entity->getRadius(); + float radius = entity->getRadiusInMeters(); // NOTE: we actually do cube-cube collision queries here, which is sloppy but good enough for now // TODO: decide whether to replace entityCube-cube query with sphere-cube (requires a square root // but will be slightly more accurate). - entityCube.setBox(entity->getPositionInDomainUnits() - glm::vec3(radius), 2.0f * radius); + entityCube.setBox(entity->getPositionInMeters() - glm::vec3(radius), 2.0f * radius); if (entityCube.touches(box)) { foundEntities.push_back(entity); } From b9cbd1ea6eb2869680474635ecdff7bd6eb73f5c Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 09:38:37 -0800 Subject: [PATCH 11/28] witch internal EntityItem data to use meters --- .../src/octree/OctreePacketProcessor.cpp | 4 +- .../src/EntityTreeRenderer.cpp | 6 +- libraries/entities/src/EntityItem.cpp | 119 +++++++++--------- libraries/entities/src/EntityItem.h | 57 +++++---- libraries/entities/src/SphereEntityItem.cpp | 3 - libraries/entities/src/TextEntityItem.cpp | 10 +- libraries/entities/src/TextEntityItem.h | 1 + 7 files changed, 103 insertions(+), 97 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 65a5c6f1a1..f87e978b66 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -59,7 +59,9 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, PacketVersion expectedVersion = versionForPacketType(voxelPacketType); // check version of piggyback packet against expected version - if (packetVersion != expectedVersion) { + if (packetVersion != expectedVersion + // TODO: remove the temporary exception below when everyone is using meters instead of DomainUnits + && !(PacketTypeEntityData == voxelPacketType && packetVersion < VERSION_ENTITIES_USE_METERS)) { static QMultiMap versionDebugSuppressMap; QUuid senderUUID = uuidFromPacketHeader(packet); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c91913f3dd..94b0e68730 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -470,7 +470,7 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg AACube maxCube = entity->getMaximumAACube(); AACube minCube = entity->getMinimumAACube(); - AABox entityBox = entity->getAABox(); + AABox entityBox = entity->getAABoxInMeters(); maxCube.scale((float) TREE_SCALE); minCube.scale((float) TREE_SCALE); @@ -542,9 +542,7 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) if (entityItem->isVisible()) { // render entityItem - AABox entityBox = entityItem->getAABox(); - - entityBox.scale(TREE_SCALE); + AABox entityBox = entityItem->getAABoxInMeters(); // TODO: some entity types (like lights) might want to be rendered even // when they are outside of the view frustum... diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 8aed4b5a4d..12eaeff62f 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -221,12 +221,12 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_PAGED_PROPERTY, // PROP_CUSTOM_PROPERTIES_INCLUDED, - APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPositionInDomainUnits()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensionsInDomainUnits()); // NOTE: PROP_RADIUS obsolete + APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPositionInMeters()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensionsInMeters()); // NOTE: PROP_RADIUS obsolete APPEND_ENTITY_PROPERTY(PROP_ROTATION, appendValue, getRotation()); APPEND_ENTITY_PROPERTY(PROP_DENSITY, appendValue, getDensity()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocityInDomainUnits()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravityInDomainUnits()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocityInMeters()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravityInMeters()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, appendValue, getDamping()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, appendValue, getLifetime()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT, appendValue, getScript()); @@ -501,8 +501,12 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef EntityPropertyFlags propertyFlags = encodedPropertyFlags; dataAt += propertyFlags.getEncodedLength(); bytesRead += propertyFlags.getEncodedLength(); - - READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInDomainUnits); + bool useMeters = (args.bitstreamVersion == VERSION_ENTITIES_USE_METERS); + if (useMeters) { + READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInMeters); + } else { + READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInDomainUnits); + } // Old bitstreams had PROP_RADIUS, new bitstreams have PROP_DIMENSIONS if (args.bitstreamVersion < VERSION_ENTITIES_SUPPORT_DIMENSIONS) { @@ -516,13 +520,22 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } } } else { - READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInDomainUnits); + if (useMeters) { + READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInMeters); + } else { + READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInDomainUnits); + } } READ_ENTITY_PROPERTY_QUAT_SETTER(PROP_ROTATION, updateRotation); READ_ENTITY_PROPERTY_SETTER(PROP_DENSITY, float, updateDensity); - READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInDomainUnits); - READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInDomainUnits); + if (useMeters) { + READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInMeters); + READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInMeters); + } else { + READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInDomainUnits); + READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInDomainUnits); + } READ_ENTITY_PROPERTY(PROP_DAMPING, float, _damping); READ_ENTITY_PROPERTY_SETTER(PROP_LIFETIME, float, updateLifetime); READ_ENTITY_PROPERTY_STRING(PROP_SCRIPT, setScript); @@ -587,8 +600,7 @@ void EntityItem::adjustEditPacketForClockSkew(unsigned char* editPacketBuffer, s } float EntityItem::computeMass() const { - // NOTE: we group the operations here in and attempt to reduce floating point error. - return ((_density * (_volumeMultiplier * _dimensions.x)) * _dimensions.y) * _dimensions.z; + return _density * _volumeMultiplier * _dimensions.x * _dimensions.y * _dimensions.z; } void EntityItem::setDensity(float density) { @@ -609,10 +621,7 @@ void EntityItem::setMass(float mass) { // we must protect the density range to help maintain stability of physics simulation // therefore this method might not accept the mass that is supplied. - // NOTE: when computing the volume we group the _volumeMultiplier (typically a very large number, due - // to the TREE_SCALE transformation) with the first dimension component (typically a very small number) - // in an attempt to reduce floating point error of the final result. - float volume = (_volumeMultiplier * _dimensions.x) * _dimensions.y * _dimensions.z; + float volume = _volumeMultiplier * _dimensions.x * _dimensions.y * _dimensions.z; // compute new density const float MIN_VOLUME = 1.0e-6f; // 0.001mm^3 @@ -717,7 +726,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasVelocity()) { // linear damping - glm::vec3 velocity = getVelocityInDomainUnits(); + glm::vec3 velocity = getVelocityInMeters(); if (_damping > 0.0f) { velocity *= powf(1.0f - _damping, timeElapsed); #ifdef WANT_DEBUG @@ -729,7 +738,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { } // integrate position forward - glm::vec3 position = getPositionInDomainUnits(); + glm::vec3 position = getPositionInMeters(); glm::vec3 newPosition = position + (velocity * timeElapsed); #ifdef WANT_DEBUG @@ -749,19 +758,19 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasGravity()) { // handle resting on surface case, this is definitely a bit of a hack, and it only works on the // "ground" plane of the domain, but for now it's what we've got - velocity += getGravityInDomainUnits() * timeElapsed; + velocity += getGravityInMeters() * timeElapsed; } float speed = glm::length(velocity); - const float EPSILON_LINEAR_VELOCITY_LENGTH = 0.001f / (float)TREE_SCALE; // 1mm/sec + const float EPSILON_LINEAR_VELOCITY_LENGTH = 0.001f; // 1mm/sec if (speed < EPSILON_LINEAR_VELOCITY_LENGTH) { - setVelocityInDomainUnits(ENTITY_ITEM_ZERO_VEC3); + setVelocityInMeters(ENTITY_ITEM_ZERO_VEC3); if (speed > 0.0f) { _dirtyFlags |= EntityItem::DIRTY_MOTION_TYPE; } } else { - setPositionInDomainUnits(position); - setVelocityInDomainUnits(velocity); + setPositionInMeters(position); + setVelocityInMeters(velocity); } #ifdef WANT_DEBUG @@ -889,7 +898,7 @@ void EntityItem::recordCreationTime() { // TODO: doesn't this need to handle rotation? -glm::vec3 EntityItem::getCenterInDomainUnits() const { +glm::vec3 EntityItem::getCenterInMeters() const { return _position + (_dimensions * (glm::vec3(0.5f,0.5f,0.5f) - _registrationPoint)); } @@ -947,13 +956,6 @@ AACube EntityItem::getMinimumAACube() const { } 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. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; @@ -968,6 +970,11 @@ AABox EntityItem::getAABox() const { return AABox(rotatedExtentsRelativeToRegistrationPoint); } +AABox EntityItem::getAABoxInDomainUnits() const { + AABox box = getAABoxInMeters(); + box *= 1.0f / (float)TREE_SCALE; + return box; +} // NOTE: This should only be used in cases of old bitstreams which only contain radius data // 0,0,0 --> maxDimension,maxDimension,maxDimension @@ -993,9 +1000,7 @@ void EntityItem::setRadius(float value) { // ... cornerToCornerLength = sqrt(3 x maxDimension ^ 2) // ... radius = sqrt(3 x maxDimension ^ 2) / 2.0f; float EntityItem::getRadiusInMeters() const { - float length = glm::length(_dimensions) * (float)TREE_SCALE; - float radius = length / 2.0f; - return radius; + return 0.5f * glm::length(_dimensions); } void EntityItem::computeShapeInfo(ShapeInfo& info) const { @@ -1003,6 +1008,7 @@ void EntityItem::computeShapeInfo(ShapeInfo& info) const { } const float MIN_POSITION_DELTA = 0.0001f; +const float MIN_DIMENSIONS_DELTA = 0.0005f; const float MIN_ALIGNMENT_DOT = 0.999999f; const float MIN_VELOCITY_DELTA = 0.01f; const float MIN_DAMPING_DELTA = 0.001f; @@ -1010,31 +1016,31 @@ const float MIN_GRAVITY_DELTA = 0.001f; const float MIN_SPIN_DELTA = 0.0003f; void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { - if (glm::distance(_position, value) * (float)TREE_SCALE > MIN_POSITION_DELTA) { - _position = value; + glm::vec3 position = value * (float)TREE_SCALE; + if (glm::distance(_position, position) > MIN_POSITION_DELTA) { + _position = position; _dirtyFlags |= EntityItem::DIRTY_POSITION; } } void EntityItem::updatePositionInMeters(const glm::vec3& value) { - glm::vec3 position = glm::clamp(value / (float) TREE_SCALE, 0.0f, 1.0f); - if (glm::distance(_position, position) * (float)TREE_SCALE > MIN_POSITION_DELTA) { - _position = position; + if (glm::distance(_position, value) > MIN_POSITION_DELTA) { + _position = value; _dirtyFlags |= EntityItem::DIRTY_POSITION; } } void EntityItem::updateDimensionsInDomainUnits(const glm::vec3& value) { - if (_dimensions != value) { - _dimensions = glm::abs(value); + glm::vec3 dimensions = value * (float)TREE_SCALE; + if (glm::distance(_dimensions, dimensions) > MIN_DIMENSIONS_DELTA) { + _dimensions = glm::abs(dimensions); _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); } } void EntityItem::updateDimensionsInMeters(const glm::vec3& value) { - glm::vec3 dimensions = glm::abs(value) / (float) TREE_SCALE; - if (_dimensions != dimensions) { - _dimensions = dimensions; + if (glm::distance(_dimensions, value) > MIN_DIMENSIONS_DELTA) { + _dimensions = value; _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); } } @@ -1051,10 +1057,7 @@ void EntityItem::updateMass(float mass) { // we must protect the density range to help maintain stability of physics simulation // therefore this method might not accept the mass that is supplied. - // NOTE: when computing the volume we group the _volumeMultiplier (typically a very large number, due - // to the TREE_SCALE transformation) with the first dimension component (typically a very small number) - // in an attempt to reduce floating point error of the final result. - float volume = (_volumeMultiplier * _dimensions.x) * _dimensions.y * _dimensions.z; + float volume = _volumeMultiplier * _dimensions.x * _dimensions.y * _dimensions.z; // compute new density float newDensity = _density; @@ -1074,23 +1077,23 @@ void EntityItem::updateMass(float mass) { } void EntityItem::updateVelocityInDomainUnits(const glm::vec3& value) { - if (glm::distance(_velocity, value) * (float)TREE_SCALE > MIN_VELOCITY_DELTA) { - if (glm::length(value) * (float)TREE_SCALE < MIN_VELOCITY_DELTA) { + glm::vec3 velocity = value * (float)TREE_SCALE; + if (glm::distance(_velocity, velocity) > MIN_VELOCITY_DELTA) { + if (glm::length(velocity) < MIN_VELOCITY_DELTA) { _velocity = ENTITY_ITEM_ZERO_VEC3; } else { - _velocity = value; + _velocity = velocity; } _dirtyFlags |= EntityItem::DIRTY_VELOCITY; } } void EntityItem::updateVelocityInMeters(const glm::vec3& value) { - glm::vec3 velocity = value / (float) TREE_SCALE; - if (glm::distance(_velocity, velocity) * (float)TREE_SCALE > MIN_VELOCITY_DELTA) { + if (glm::distance(_velocity, value) > MIN_VELOCITY_DELTA) { if (glm::length(value) < MIN_VELOCITY_DELTA) { _velocity = ENTITY_ITEM_ZERO_VEC3; } else { - _velocity = velocity; + _velocity = value; } _dirtyFlags |= EntityItem::DIRTY_VELOCITY; } @@ -1104,16 +1107,16 @@ void EntityItem::updateDamping(float value) { } void EntityItem::updateGravityInDomainUnits(const glm::vec3& value) { - if (glm::distance(_gravity, value) * (float)TREE_SCALE > MIN_GRAVITY_DELTA) { - _gravity = value; + glm::vec3 gravity = value * (float) TREE_SCALE; + if (glm::distance(_gravity, gravity) > MIN_GRAVITY_DELTA) { + _gravity = gravity; _dirtyFlags |= EntityItem::DIRTY_VELOCITY; } } void EntityItem::updateGravityInMeters(const glm::vec3& value) { - glm::vec3 gravity = value / (float) TREE_SCALE; - if ( glm::distance(_gravity, gravity) * (float)TREE_SCALE > MIN_GRAVITY_DELTA) { - _gravity = gravity; + if ( glm::distance(_gravity, value) > MIN_GRAVITY_DELTA) { + _gravity = value; _dirtyFlags |= EntityItem::DIRTY_VELOCITY; } } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 662bde216a..ad20ca66e4 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -37,7 +37,7 @@ class EntityTreeElementExtraEncodeData; #define debugTime(T, N) qPrintable(QString("%1 [ %2 ago]").arg(T, 16, 10).arg(formatUsecTime(N - T), 15)) #define debugTimeOnly(T) qPrintable(QString("%1").arg(T, 16, 10)) -#define debugTreeVector(V) V << "[" << (V * (float)TREE_SCALE) << " in meters ]" +#define debugTreeVector(V) V << "[" << V << " in meters ]" /// EntityItem class this is the base class for all entity types. It handles the basic properties and functionality available @@ -145,26 +145,26 @@ public: // attributes applicable to all entity types EntityTypes::EntityType getType() const { return _type; } - const glm::vec3& getPositionInDomainUnits() const { return _position; } /// get position in domain scale units (0.0 - 1.0) - glm::vec3 getPositionInMeters() const { return _position * (float) TREE_SCALE; } /// get position in meters + glm::vec3 getPositionInDomainUnits() const { return _position / (float)TREE_SCALE; } /// get position in domain scale units (0.0 - 1.0) + const glm::vec3& getPositionInMeters() const { return _position; } /// get position in meters /// set position in domain scale units (0.0 - 1.0) - void setPositionInDomainUnits(const glm::vec3& value) { _position = value; } - void setPositionInMeters(const glm::vec3& value) /// set position in meter units (0.0 - TREE_SCALE) - { setPositionInDomainUnits(glm::clamp(value / (float) TREE_SCALE, 0.0f, 1.0f)); } + void setPositionInDomainUnits(const glm::vec3& value) + { setPositionInMeters(glm::clamp(value, 0.0f, 1.0f) * (float)TREE_SCALE); } + void setPositionInMeters(const glm::vec3& value) { _position = value; } - glm::vec3 getCenterInDomainUnits() const; /// calculates center of the entity in domain scale units (0.0 - 1.0) - glm::vec3 getCenterInMeters() const { return getCenterInDomainUnits() * (float) TREE_SCALE; } + glm::vec3 getCenterInDomainUnits() const { return getCenterInMeters() / (float) TREE_SCALE; } + glm::vec3 getCenterInMeters() const; - const glm::vec3& getDimensionsInDomainUnits() const { return _dimensions; } /// get dimensions in domain scale units (0.0 - 1.0) - glm::vec3 getDimensionsInMeters() const { return _dimensions * (float) TREE_SCALE; } /// get dimensions in meters + glm::vec3 getDimensionsInDomainUnits() const { return _dimensions / (float)TREE_SCALE; } /// get dimensions in domain scale units (0.0 - 1.0) + const glm::vec3& getDimensionsInMeters() const { return _dimensions; } /// get dimensions in meters float getLargestDimensionInDomainUnits() const { return glm::length(_dimensions); } /// get the largest possible dimension - /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensionsInDomainUnits(const glm::vec3& value) { _dimensions = value; } + /// set dimensions in domain scale units (0.0 - 1.0) + virtual void setDimensionsInDomainUnits(const glm::vec3& value) { _dimensions = glm::abs(value) * (float)TREE_SCALE; } - /// set dimensions in meter units (0.0 - TREE_SCALE) this will also reset radius appropriately - void setDimensionsInMeters(const glm::vec3& value) { setDimensionsInDomainUnits(value / (float) TREE_SCALE); } + /// set dimensions in meter units (0.0 - TREE_SCALE) + virtual void setDimensionsInMeters(const glm::vec3& value) { _dimensions = glm::abs(value); } const glm::quat& getRotation() const { return _rotation; } void setRotation(const glm::quat& rotation) { _rotation = rotation; } @@ -181,16 +181,16 @@ public: float getDensity() const { return _density; } - const glm::vec3& getVelocityInDomainUnits() const { return _velocity; } /// velocity in domain scale units (0.0-1.0) per second - glm::vec3 getVelocityInMeters() const { return _velocity * (float) TREE_SCALE; } /// get velocity in meters - void setVelocityInDomainUnits(const glm::vec3& value) { _velocity = value; } /// velocity in domain scale units (0.0-1.0) per second - void setVelocityInMeters(const glm::vec3& value) { _velocity = value / (float) TREE_SCALE; } /// velocity in meters + glm::vec3 getVelocityInDomainUnits() const { return _velocity / (float)TREE_SCALE; } /// velocity in domain scale units (0.0-1.0) per second + const glm::vec3 getVelocityInMeters() const { return _velocity; } /// get velocity in meters + void setVelocityInDomainUnits(const glm::vec3& value) { _velocity = value * (float)TREE_SCALE; } /// velocity in domain scale units (0.0-1.0) per second + void setVelocityInMeters(const glm::vec3& value) { _velocity = value; } /// velocity in meters bool hasVelocity() const { return _velocity != ENTITY_ITEM_ZERO_VEC3; } - const glm::vec3& getGravityInDomainUnits() const { return _gravity; } /// gravity in domain scale units (0.0-1.0) per second squared - glm::vec3 getGravityInMeters() const { return _gravity * (float) TREE_SCALE; } /// get gravity in meters - void setGravityInDomainUnits(const glm::vec3& value) { _gravity = value; } /// gravity in domain scale units (0.0-1.0) per second squared - void setGravityInMeters(const glm::vec3& value) { _gravity = value / (float) TREE_SCALE; } /// gravity in meters + glm::vec3 getGravityInDomainUnits() const { return _gravity / (float)TREE_SCALE; } /// gravity in domain scale units (0.0-1.0) per second squared + const glm::vec3& getGravityInMeters() const { return _gravity; } /// get gravity in meters + void setGravityInDomainUnits(const glm::vec3& value) { _gravity = value * (float)TREE_SCALE; } /// gravity in domain scale units (0.0-1.0) per second squared + void setGravityInMeters(const glm::vec3& value) { _gravity = value; } /// gravity in meters bool hasGravity() const { return _gravity != ENTITY_ITEM_ZERO_VEC3; } float getDamping() const { return _damping; } @@ -215,7 +215,7 @@ public: 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) + AABox getAABoxInDomainUnits() const; /// axis aligned bounding box in domain scale units (0.0 - 1.0) const QString& getScript() const { return _script; } void setScript(const QString& value) { _script = value; } @@ -254,7 +254,7 @@ public: float getRadiusInMeters() 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 bool containsInDomainUnits(const glm::vec3& point) const { return getAABoxInDomainUnits().contains(point); } virtual void computeShapeInfo(ShapeInfo& info) const; /// return preferred shape type (actual physical shape may differ) @@ -319,11 +319,10 @@ protected: float _glowLevel; float _localRenderAlpha; float _density = ENTITY_ITEM_DEFAULT_DENSITY; // kg/m^3 - // NOTE: _volumeMultiplier is used to compute volume: - // volume = _volumeMultiplier * _dimensions.x * _dimensions.y * _dimensions.z = m^3 - // DANGER: due to the size of TREE_SCALE the _volumeMultiplier is always a large number, and therefore - // will tend to introduce floating point error. We must keep this in mind when using it. - float _volumeMultiplier = (float)TREE_SCALE * (float)TREE_SCALE * (float)TREE_SCALE; + // NOTE: _volumeMultiplier is used to allow some mass properties code exist in the EntityItem base class + // rather than in all of the derived classes. If we ever collapse these classes to one we could do it a + // different way. + float _volumeMultiplier = 1.0f; glm::vec3 _velocity; glm::vec3 _gravity; float _damping; diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 75788c979f..e21a2573a2 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -32,9 +32,6 @@ SphereEntityItem::SphereEntityItem(const EntityItemID& entityItemID, const Entit { _type = EntityTypes::Sphere; setProperties(properties); - // NOTE: _volumeMultiplier is used to compute volume: - // volume = _volumeMultiplier * _dimensions.x * _dimensions.y * _dimensions.z - // The formula below looks funny because _dimension.xyz = diameter rather than radius. _volumeMultiplier *= PI / 6.0f; } diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index a716bba0e2..d008bceccc 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -40,10 +40,16 @@ TextEntityItem::TextEntityItem(const EntityItemID& entityItemID, const EntityIte setProperties(properties); } +const float TEXT_ENTITY_ITEM_FIXED_DEPTH = 0.01f; + +void TextEntityItem::setDimensionsInMeters(const glm::vec3& value) { + // NOTE: Text Entities always have a "depth" of 1cm. + _dimensions = glm::vec3(value.x, value.y, TEXT_ENTITY_ITEM_FIXED_DEPTH); +} + void TextEntityItem::setDimensionsInDomainUnits(const glm::vec3& value) { // NOTE: Text Entities always have a "depth" of 1cm. - float fixedDepth = 0.01f / (float)TREE_SCALE; - _dimensions = glm::vec3(value.x, value.y, fixedDepth); + _dimensions = glm::vec3(value.x * (float)TREE_SCALE, value.y * (float)TREE_SCALE, TEXT_ENTITY_ITEM_FIXED_DEPTH); } EntityItemProperties TextEntityItem::getProperties() const { diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 60f82f4936..1ee9c2c194 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -23,6 +23,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately + virtual void setDimensionsInMeters(const glm::vec3& value); virtual void setDimensionsInDomainUnits(const glm::vec3& value); virtual ShapeType getShapeType() const { return SHAPE_TYPE_BOX; } From aede107058409ae5edcc1d0265d0c3c70112a7af Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 09:41:07 -0800 Subject: [PATCH 12/28] change version of Entity update packet --- libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/networking/src/PacketHeaders.h | 1 + libraries/octree/src/Octree.cpp | 52 ---------------------- libraries/octree/src/Octree.h | 3 -- 4 files changed, 2 insertions(+), 56 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 2eee540fff..489017788a 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -72,7 +72,7 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: - return VERSION_MODEL_ENTITIES_SUPPORT_SHAPE_TYPE; + return VERSION_ENTITIES_USE_METERS; case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index e593955b51..42f28e5e97 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -128,6 +128,7 @@ const PacketVersion VERSION_ENTITIES_MODELS_HAVE_ANIMATION_SETTINGS = 5; const PacketVersion VERSION_ENTITIES_HAVE_USER_DATA = 6; const PacketVersion VERSION_ENTITIES_HAS_LAST_SIMULATED_TIME = 7; const PacketVersion VERSION_MODEL_ENTITIES_SUPPORT_SHAPE_TYPE = 8; +const PacketVersion VERSION_ENTITIES_USE_METERS = 9; const PacketVersion VERSION_OCTREE_HAS_FILE_BREAKS = 1; #endif // hifi_PacketHeaders_h diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index a1df449135..2661d85930 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -2083,58 +2083,6 @@ bool Octree::countOctreeElementsOperation(OctreeElement* element, void* extraDat return true; // keep going } -void Octree::copySubTreeIntoNewTree(OctreeElement* startElement, Octree* destinationTree, bool rebaseToRoot) { - OctreeElementBag elementBag; - elementBag.insert(startElement); - int chopLevels = 0; - if (rebaseToRoot) { - chopLevels = numberOfThreeBitSectionsInCode(startElement->getOctalCode()); - } - - EncodeBitstreamParams params(INT_MAX, IGNORE_VIEW_FRUSTUM, WANT_COLOR, NO_EXISTS_BITS, chopLevels); - OctreeElementExtraEncodeData extraEncodeData; - params.extraEncodeData = &extraEncodeData; - - OctreePacketData packetData; - - while (!elementBag.isEmpty()) { - OctreeElement* subTree = elementBag.extract(); - packetData.reset(); // reset the packet between usage - // ask our tree to write a bitsteam - encodeTreeBitstream(subTree, &packetData, elementBag, params); - // ask destination tree to read the bitstream - ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS); - destinationTree->readBitstreamToTree(packetData.getUncompressedData(), packetData.getUncompressedSize(), args); - } -} - -void Octree::copyFromTreeIntoSubTree(Octree* sourceTree, OctreeElement* destinationElement) { - OctreeElementBag elementBag; - // If we were given a specific element, start from there, otherwise start from root - elementBag.insert(sourceTree->_rootElement); - - OctreePacketData packetData; - - EncodeBitstreamParams params(INT_MAX, IGNORE_VIEW_FRUSTUM, WANT_COLOR, NO_EXISTS_BITS); - OctreeElementExtraEncodeData extraEncodeData; - params.extraEncodeData = &extraEncodeData; - - while (!elementBag.isEmpty()) { - OctreeElement* subTree = elementBag.extract(); - - packetData.reset(); // reset between usage - - // ask our tree to write a bitsteam - sourceTree->encodeTreeBitstream(subTree, &packetData, elementBag, params); - - // ask destination tree to read the bitstream - bool wantImportProgress = true; - ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS, destinationElement, - 0, SharedNodePointer(), wantImportProgress); - readBitstreamToTree(packetData.getUncompressedData(), packetData.getUncompressedSize(), args); - } -} - void Octree::cancelImport() { _stopImport = true; } diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 870e18983e..8774ebe55b 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -323,9 +323,6 @@ public: unsigned long getOctreeElementsCount(); - void copySubTreeIntoNewTree(OctreeElement* startElement, Octree* destinationTree, bool rebaseToRoot); - void copyFromTreeIntoSubTree(Octree* sourceTree, OctreeElement* destinationElement); - bool getShouldReaverage() const { return _shouldReaverage; } void recurseElementWithOperation(OctreeElement* element, RecurseOctreeOperation operation, From c88f236d1c212f0856f4b393c344240ada0fc0b4 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 09:41:23 -0800 Subject: [PATCH 13/28] get version from packet --- libraries/octree/src/OctreeRenderer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 5bcf49a1a4..187f916d35 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -65,7 +65,8 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar unsigned int numBytesPacketHeader = numBytesForPacketHeader(dataByteArray); QUuid sourceUUID = uuidFromPacketHeader(dataByteArray); PacketType expectedType = getExpectedPacketType(); - PacketVersion expectedVersion = _tree->expectedVersion(); // TODO: would be better to read this from the packet! + // packetVersion is the second byte + PacketVersion packetVersion = dataByteArray[1]; if(command == expectedType) { PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram expected PacketType", showTimingDetails); @@ -117,7 +118,7 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar if (sectionLength) { // ask the VoxelTree to read the bitstream into the tree ReadBitstreamToTreeParams args(packetIsColored ? WANT_COLOR : NO_COLOR, WANT_EXISTS_BITS, NULL, - sourceUUID, sourceNode, false, expectedVersion); + sourceUUID, sourceNode, false, packetVersion); _tree->lockForWrite(); OctreePacketData packetData(packetIsCompressed); packetData.loadFinalizedContent(dataAt, sectionLength); From ca1c9b410511d3e78a31b32e5847fd778d08ff29 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 16:05:29 -0800 Subject: [PATCH 14/28] EntityItem::findEntities() uses meters --- interface/src/Application.cpp | 3 +-- libraries/entities/src/EntityTree.cpp | 3 ++- libraries/entities/src/EntityTree.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d3161ebf51..5e95e7243a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1642,8 +1642,7 @@ void Application::setActiveFaceTracker() { bool Application::exportEntities(const QString& filename, float x, float y, float z, float scale) { QVector entities; - _entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE, - y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), entities); + _entities.getTree()->findEntities(AACube(glm::vec3(x, y, z), scale), entities); if (entities.size() > 0) { glm::vec3 root(x, y, z); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index aef5b1d2bf..619ff94048 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -515,7 +515,8 @@ public: bool EntityTree::findInCubeOperation(OctreeElement* element, void* extraData) { FindEntitiesInCubeArgs* args = static_cast(extraData); - const AACube& elementCube = element->getAACube(); + AACube elementCube = element->getAACube(); + elementCube *= (float)TREE_SCALE; if (elementCube.touches(args->_cube)) { EntityTreeElement* entityTreeElement = static_cast(element); entityTreeElement->getEntities(args->_cube, args->_foundEntities); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index e748df2548..852d07d20f 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -112,7 +112,7 @@ public: void findEntitiesInMeters(const glm::vec3& center, float radius, QVector& foundEntities); /// finds all entities that touch a cube - /// \param cube the query cube + /// \param cube the query cube in world-frame (meters) /// \param foundEntities[out] vector of non-const EntityItem* /// \remark Side effect: any initial contents in entities will be lost void findEntities(const AACube& cube, QVector& foundEntities); From d7d25a6509707df42e998c85fb3acf9c27a47d15 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 16:16:49 -0800 Subject: [PATCH 15/28] Octree::findCapsulePenetration() uses meters --- libraries/entities/src/EntityTree.cpp | 6 +++--- libraries/octree/src/Octree.cpp | 14 +++++--------- libraries/octree/src/OctreeElement.cpp | 4 ++-- libraries/shared/src/AACube.h | 8 -------- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 619ff94048..850523917d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -425,7 +425,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) glm::vec3 penetration; AACube cube = entityTreeElement->getAACube(); - cube *= (float)TREE_SCALE; + cube.scale((float)TREE_SCALE); bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); // If this entityTreeElement contains the point, then search it... @@ -478,7 +478,7 @@ bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) FindAllNearPointArgs* args = static_cast(extraData); glm::vec3 penetration; AACube cube = element->getAACube(); - cube *= (float)TREE_SCALE; + cube.scale((float)TREE_SCALE); bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); // If this element contains the point, then search it... @@ -516,7 +516,7 @@ public: bool EntityTree::findInCubeOperation(OctreeElement* element, void* extraData) { FindEntitiesInCubeArgs* args = static_cast(extraData); AACube elementCube = element->getAACube(); - elementCube *= (float)TREE_SCALE; + elementCube.scale((float)TREE_SCALE); if (elementCube.touches(args->_cube)) { EntityTreeElement* entityTreeElement = static_cast(element); entityTreeElement->getEntities(args->_cube, args->_foundEntities); diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 2661d85930..3b43a4a5d2 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -750,7 +750,7 @@ bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { // the details in args is in meters (world-frame) so we have to scale the element cube up AACube box = element->getAACube(); - box *= (float)TREE_SCALE; + box.scale((float)TREE_SCALE); // coarse check against bounds if (!box.expandedContains(args->center, args->radius)) { @@ -837,14 +837,15 @@ bool findCapsulePenetrationOp(OctreeElement* element, void* extraData) { CapsuleArgs* args = static_cast(extraData); // coarse check against bounds - const AACube& box = element->getAACube(); + AACube box = element->getAACube(); + box.scale((float)TREE_SCALE); if (!box.expandedIntersectsSegment(args->start, args->end, args->radius)) { return false; } if (element->hasContent()) { glm::vec3 nodePenetration; if (box.findCapsulePenetration(args->start, args->end, args->radius, nodePenetration)) { - args->penetration = addPenetrations(args->penetration, nodePenetration * (float)(TREE_SCALE)); + args->penetration = addPenetrations(args->penetration, nodePenetration); args->found = true; } } @@ -891,12 +892,7 @@ bool findContentInCubeOp(OctreeElement* element, void* extraData) { bool Octree::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration, Octree::lockType lockType, bool* accurateResult) { - CapsuleArgs args = { - start / (float)(TREE_SCALE), - end / (float)(TREE_SCALE), - radius / (float)(TREE_SCALE), - penetration, - false }; + CapsuleArgs args = { start, end, radius, penetration, false }; penetration = glm::vec3(0.0f, 0.0f, 0.0f); bool gotLock = false; diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 954d0b7847..bdfe87a653 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -1338,7 +1338,7 @@ bool OctreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3 keepSearching = true; // assume that we will continue searching after this. AACube cube = getAACube(); - cube *= (float)TREE_SCALE; + cube.scale((float)TREE_SCALE); float distanceToElementCube = std::numeric_limits::max(); float distanceToElementDetails = distance; BoxFace localFace; @@ -1392,7 +1392,7 @@ bool OctreeElement::findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const { // center and radius are in meters, so we have to scale the _cube into world-frame AACube cube = _cube; - cube *= (float)TREE_SCALE; + cube.scale((float)TREE_SCALE); return cube.findSpherePenetration(center, radius, penetration); } diff --git a/libraries/shared/src/AACube.h b/libraries/shared/src/AACube.h index 5bcf9527cf..b29bc49bef 100644 --- a/libraries/shared/src/AACube.h +++ b/libraries/shared/src/AACube.h @@ -63,8 +63,6 @@ public: AABox clamp(const glm::vec3& min, const glm::vec3& max) const; AABox clamp(float min, float max) const; - AACube& operator *= (float scale); - private: glm::vec3 getClosestPointOnFace(const glm::vec3& point, BoxFace face) const; glm::vec3 getClosestPointOnFace(const glm::vec4& origin, const glm::vec4& direction, BoxFace face) const; @@ -76,12 +74,6 @@ private: float _scale; }; -inline AACube& AACube::operator *= (float scale) { - _corner *= scale; - _scale *= scale; - return *this; -} - inline bool operator==(const AACube& a, const AACube& b) { return a.getCorner() == b.getCorner() && a.getScale() == b.getScale(); } From 26bb67784060976cc933f24e484f1fb73e6cc670 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 17:26:52 -0800 Subject: [PATCH 16/28] remove ViewFrustum::*VoxelScale() function calls we do our math in meters now --- libraries/octree/src/OctreeElement.cpp | 8 +++++--- libraries/octree/src/ViewFrustum.cpp | 27 -------------------------- libraries/octree/src/ViewFrustum.h | 6 +----- 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index bdfe87a653..5e6fd0dde3 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -1257,10 +1257,12 @@ bool OctreeElement::calculateShouldRender(const ViewFrustum* viewFrustum, float // does as much math as possible in voxel scale and then scales up to TREE_SCALE at end float OctreeElement::furthestDistanceToCamera(const ViewFrustum& viewFrustum) const { glm::vec3 furthestPoint; - viewFrustum.getFurthestPointFromCameraVoxelScale(getAACube(), furthestPoint); - glm::vec3 temp = viewFrustum.getPositionVoxelScale() - furthestPoint; + AACube cube = getAACube(); + cube.scale((float)TREE_SCALE); + viewFrustum.getFurthestPointFromCamera(cube, furthestPoint); + glm::vec3 temp = viewFrustum.getPosition() - furthestPoint; float distanceToFurthestPoint = sqrtf(glm::dot(temp, temp)); - return distanceToFurthestPoint * (float)TREE_SCALE; + return distanceToFurthestPoint; } float OctreeElement::distanceToCamera(const ViewFrustum& viewFrustum) const { diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index 81ce31d767..164f78249b 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -833,33 +833,6 @@ void ViewFrustum::getFurthestPointFromCamera(const AACube& box, glm::vec3& furth } } -void ViewFrustum::getFurthestPointFromCameraVoxelScale(const AACube& box, glm::vec3& furthestPoint) const { - const glm::vec3& bottomNearRight = box.getCorner(); - float scale = box.getScale(); - float halfScale = scale * 0.5f; - - if (_positionVoxelScale.x < bottomNearRight.x + halfScale) { - // we are to the right of the center, so the left edge is furthest - furthestPoint.x = bottomNearRight.x + scale; - } else { - furthestPoint.x = bottomNearRight.x; - } - - if (_positionVoxelScale.y < bottomNearRight.y + halfScale) { - // we are below of the center, so the top edge is furthest - furthestPoint.y = bottomNearRight.y + scale; - } else { - furthestPoint.y = bottomNearRight.y; - } - - if (_positionVoxelScale.z < bottomNearRight.z + halfScale) { - // we are to the near side of the center, so the far side edge is furthest - furthestPoint.z = bottomNearRight.z + scale; - } else { - furthestPoint.z = bottomNearRight.z; - } -} - float ViewFrustum::distanceToCamera(const glm::vec3& point) const { glm::vec3 temp = getPosition() - point; float distanceToPoint = sqrtf(glm::dot(temp, temp)); diff --git a/libraries/octree/src/ViewFrustum.h b/libraries/octree/src/ViewFrustum.h index 3f7921f9b7..edef001cdd 100644 --- a/libraries/octree/src/ViewFrustum.h +++ b/libraries/octree/src/ViewFrustum.h @@ -37,12 +37,11 @@ public: ViewFrustum(); // setters for camera attributes - void setPosition(const glm::vec3& p) { _position = p; _positionVoxelScale = (p / (float)TREE_SCALE); } + void setPosition(const glm::vec3& p) { _position = p; } void setOrientation(const glm::quat& orientationAsQuaternion); // getters for camera attributes const glm::vec3& getPosition() const { return _position; } - const glm::vec3& getPositionVoxelScale() const { return _positionVoxelScale; } const glm::quat& getOrientation() const { return _orientation; } const glm::vec3& getDirection() const { return _direction; } const glm::vec3& getUp() const { return _up; } @@ -119,8 +118,6 @@ public: OctreeProjectedPolygon getProjectedPolygon(const AACube& box) const; void getFurthestPointFromCamera(const AACube& box, glm::vec3& furthestPoint) const; - void getFurthestPointFromCameraVoxelScale(const AACube& box, glm::vec3& furthestPoint) const; - float distanceToCamera(const glm::vec3& point) const; private: @@ -134,7 +131,6 @@ private: // camera location/orientation attributes glm::vec3 _position = glm::vec3(0.0f); // the position in world-frame - glm::vec3 _positionVoxelScale = glm::vec3(0.0f); // the position in voxel scale glm::quat _orientation = glm::quat(); // calculated for orientation From 59a70b5b5f426e9935cd37e7d5970fc633cc4d29 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 4 Mar 2015 17:32:46 -0800 Subject: [PATCH 17/28] remove cruft and fix default entity dimensions --- libraries/entities/src/EntityItemPropertiesDefaults.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 22beb3937e..b184d510b3 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -20,8 +20,6 @@ // creating a new one on the stack so we declare the ZERO_VEC3 constant as an optimization. const glm::vec3 ENTITY_ITEM_ZERO_VEC3(0.0f); -const glm::vec3 REGULAR_GRAVITY = glm::vec3(0, -9.8f / (float)TREE_SCALE, 0); - const bool ENTITY_ITEM_DEFAULT_LOCKED = false; const QString ENTITY_ITEM_DEFAULT_USER_DATA = QString(""); @@ -37,7 +35,7 @@ const float ENTITY_ITEM_DEFAULT_LIFETIME = ENTITY_ITEM_IMMORTAL_LIFETIME; const glm::quat ENTITY_ITEM_DEFAULT_ROTATION; const float ENTITY_ITEM_DEFAULT_WIDTH = 0.1f; -const glm::vec3 ENTITY_ITEM_DEFAULT_DIMENSIONS = glm::vec3(ENTITY_ITEM_DEFAULT_WIDTH) / (float)TREE_SCALE; +const glm::vec3 ENTITY_ITEM_DEFAULT_DIMENSIONS = glm::vec3(ENTITY_ITEM_DEFAULT_WIDTH); const float ENTITY_ITEM_DEFAULT_VOLUME = ENTITY_ITEM_DEFAULT_WIDTH * ENTITY_ITEM_DEFAULT_WIDTH * ENTITY_ITEM_DEFAULT_WIDTH; const float ENTITY_ITEM_MAX_DENSITY = 10000.0f; // kg/m^3 density of silver From e4c68bf31c0a2e1e2842538594581e262352b7dd Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 5 Mar 2015 18:06:08 -0800 Subject: [PATCH 18/28] committing some temp debug stuff to help git diff (will remove this stuff later) --- CMakeLists.txt | 2 +- .../src/EntityTreeRenderer.cpp | 8 +++++- libraries/entities/src/BoxEntityItem.cpp | 1 + libraries/entities/src/EntityItem.cpp | 28 ++++++------------- libraries/entities/src/EntityItem.h | 7 +++-- .../entities/src/EntityItemProperties.cpp | 1 + libraries/entities/src/EntityTreeElement.cpp | 7 +++++ libraries/entities/src/EntityTreeElement.h | 1 + libraries/octree/src/OctreeRenderer.cpp | 3 ++ 9 files changed, 34 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af707acf57..3242d981ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,4 +181,4 @@ endif () if (ANDROID OR DESKTOP_GVR) add_subdirectory(gvr-interface) -endif () \ No newline at end of file +endif () diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 82b9825a56..1a7d9c8ca7 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -48,6 +48,7 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf _displayModelElementProxy(false), _dontDoPrecisionPicking(false) { + std::cout << "adebug " << (void*)(this) << " EntityTreeRenderer ctor" << std::endl; // adebug REGISTER_ENTITY_TYPE_WITH_FACTORY(Model, RenderableModelEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Box, RenderableBoxEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Sphere, RenderableSphereEntityItem::factory) @@ -480,7 +481,6 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg maxCube.scale((float) TREE_SCALE); minCube.scale((float) TREE_SCALE); - entityBox.scale((float) TREE_SCALE); glm::vec3 maxCenter = maxCube.calcCenter(); glm::vec3 minCenter = minCube.calcCenter(); @@ -672,10 +672,16 @@ RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(cons (void**)&intersectedEntity, lockType, &result.accurate, precisionPicking); if (result.intersects && intersectedEntity) { + std::cout << "adebug " << (void*)(this) << " EntityTreeRenderer's tree = " << (void*)(_tree) << std::endl; // adebug + int foo = 0; result.entityID = intersectedEntity->getEntityItemID(); + foo = 1; result.properties = intersectedEntity->getProperties(); + foo = 2; result.intersection = ray.origin + (ray.direction * result.distance); + foo = 3; result.entity = intersectedEntity; + std::cout << "adebug foo = " << foo << std::endl; // adebug } } return result; diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 1e8c811122..5256877b44 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -41,6 +41,7 @@ EntityItemProperties BoxEntityItem::getProperties() const { properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; + std::cout << "adebug end of BoxEntityItem::getProperties()" << std::endl; // adebug return properties; } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 12eaeff62f..b6381f196d 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -795,6 +795,7 @@ quint64 EntityItem::getExpiry() const { } EntityItemProperties EntityItem::getProperties() const { + std::cout << "adebug EntityItem::getProperties" << std::endl; // adebug EntityItemProperties properties; properties._id = getID(); properties._idSet = true; @@ -824,6 +825,7 @@ EntityItemProperties EntityItem::getProperties() const { properties._defaultSettings = false; + std::cout << "adebug about to delete properties" << std::endl; // adebug return properties; } @@ -1017,31 +1019,27 @@ const float MIN_SPIN_DELTA = 0.0003f; void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { glm::vec3 position = value * (float)TREE_SCALE; - if (glm::distance(_position, position) > MIN_POSITION_DELTA) { - _position = position; - _dirtyFlags |= EntityItem::DIRTY_POSITION; - } + updatePositionInMeters(position); } void EntityItem::updatePositionInMeters(const glm::vec3& value) { if (glm::distance(_position, value) > MIN_POSITION_DELTA) { _position = value; _dirtyFlags |= EntityItem::DIRTY_POSITION; + std::cout << "adebug updatePositionInMeters = " << _position << std::endl; // adebug } } void EntityItem::updateDimensionsInDomainUnits(const glm::vec3& value) { glm::vec3 dimensions = value * (float)TREE_SCALE; - if (glm::distance(_dimensions, dimensions) > MIN_DIMENSIONS_DELTA) { - _dimensions = glm::abs(dimensions); - _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); - } + updateDimensionsInMeters(dimensions); } void EntityItem::updateDimensionsInMeters(const glm::vec3& value) { if (glm::distance(_dimensions, value) > MIN_DIMENSIONS_DELTA) { _dimensions = value; _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); + std::cout << "adebug updateDimensionsInMeters = " << value << std::endl; // adebug } } @@ -1078,14 +1076,7 @@ void EntityItem::updateMass(float mass) { void EntityItem::updateVelocityInDomainUnits(const glm::vec3& value) { glm::vec3 velocity = value * (float)TREE_SCALE; - if (glm::distance(_velocity, velocity) > MIN_VELOCITY_DELTA) { - if (glm::length(velocity) < MIN_VELOCITY_DELTA) { - _velocity = ENTITY_ITEM_ZERO_VEC3; - } else { - _velocity = velocity; - } - _dirtyFlags |= EntityItem::DIRTY_VELOCITY; - } + updateVelocityInMeters(velocity); } void EntityItem::updateVelocityInMeters(const glm::vec3& value) { @@ -1108,10 +1099,7 @@ void EntityItem::updateDamping(float value) { void EntityItem::updateGravityInDomainUnits(const glm::vec3& value) { glm::vec3 gravity = value * (float) TREE_SCALE; - if (glm::distance(_gravity, gravity) > MIN_GRAVITY_DELTA) { - _gravity = gravity; - _dirtyFlags |= EntityItem::DIRTY_VELOCITY; - } + updateGravityInMeters(gravity); } void EntityItem::updateGravityInMeters(const glm::vec3& value) { diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index ad20ca66e4..a494831317 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -22,6 +22,7 @@ #include // for OctreeElement::AppendState #include #include +#include // adebug #include "EntityItemID.h" #include "EntityItemProperties.h" @@ -151,14 +152,16 @@ public: /// set position in domain scale units (0.0 - 1.0) void setPositionInDomainUnits(const glm::vec3& value) { setPositionInMeters(glm::clamp(value, 0.0f, 1.0f) * (float)TREE_SCALE); } - void setPositionInMeters(const glm::vec3& value) { _position = value; } + void setPositionInMeters(const glm::vec3& value) { + _position = value; + std::cout << "adebug setPosition = " << _position << std::endl; // adebug + } glm::vec3 getCenterInDomainUnits() const { return getCenterInMeters() / (float) TREE_SCALE; } glm::vec3 getCenterInMeters() const; glm::vec3 getDimensionsInDomainUnits() const { return _dimensions / (float)TREE_SCALE; } /// get dimensions in domain scale units (0.0 - 1.0) const glm::vec3& getDimensionsInMeters() const { return _dimensions; } /// get dimensions in meters - float getLargestDimensionInDomainUnits() const { return glm::length(_dimensions); } /// get the largest possible dimension /// set dimensions in domain scale units (0.0 - 1.0) virtual void setDimensionsInDomainUnits(const glm::vec3& value) { _dimensions = glm::abs(value) * (float)TREE_SCALE; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index e53a6ede3d..c6414f620b 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -80,6 +80,7 @@ EntityItemProperties::EntityItemProperties() : } EntityItemProperties::~EntityItemProperties() { + std::cout << "adebug delete properties" << std::endl; // adebug } void EntityItemProperties::setSittingPoints(const QVector& sittingPoints) { diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index f746a03054..e32434b4c6 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -22,9 +22,15 @@ EntityTreeElement::EntityTreeElement(unsigned char* octalCode) : OctreeElement() }; EntityTreeElement::~EntityTreeElement() { + int bar = 0; _octreeMemoryUsage -= sizeof(EntityTreeElement); + bar = 1; + std::cout << "adebug EntityTreeElement " << (void*)(this) << " deletes old entityItems = " << (void*)(_entityItems) << std::endl; // adebug delete _entityItems; + bar = 2; _entityItems = NULL; + bar = 3; + std::cout << "adebug bar = " << bar << std::endl; // adebug } // This will be called primarily on addChildAt(), which means we're adding a child of our @@ -39,6 +45,7 @@ OctreeElement* EntityTreeElement::createNewElement(unsigned char* octalCode) { void EntityTreeElement::init(unsigned char* octalCode) { OctreeElement::init(octalCode); _entityItems = new QList; + std::cout << "adebug EntityTreeElement " << (void*)(this) << " gets new entityItems = " << (void*)(_entityItems) << std::endl; // adebug _octreeMemoryUsage += sizeof(EntityTreeElement); } diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index 424e3ca520..ad91010b0b 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -73,6 +73,7 @@ public: class EntityTreeElement : public OctreeElement { friend class EntityTree; // to allow createElement to new us... + EntityTreeElement(); EntityTreeElement(unsigned char* octalCode = NULL); virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 187f916d35..c4ccd98036 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -22,11 +22,13 @@ OctreeRenderer::OctreeRenderer() : _managedTree(false), _viewFrustum(NULL) { + std::cout << "adebug " << (void*)(this) << " OctreeRenderer() _tree = " << (void*)(_tree) << std::endl; // adebug } void OctreeRenderer::init() { if (!_tree) { _tree = createTree(); + std::cout << "adebug " << (void*)(this) << " init _tree = " << (void*)(_tree) << std::endl; // adebug _managedTree = true; } } @@ -43,6 +45,7 @@ void OctreeRenderer::setTree(Octree* newTree) { _managedTree = false; } _tree = newTree; + std::cout << "adebug " << (void*)(this) << " setTree() _tree = " << (void*)(_tree) << std::endl; // adebug } void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { From 6fa1b1c6007d4dcd8eb10f8323414d10a6e2bf9a Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 15:31:27 -0800 Subject: [PATCH 19/28] remove unused cruft and fix float casts --- libraries/shared/src/OctalCode.cpp | 15 ++++----------- libraries/shared/src/OctalCode.h | 3 --- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/libraries/shared/src/OctalCode.cpp b/libraries/shared/src/OctalCode.cpp index 82bd471975..f26f103487 100644 --- a/libraries/shared/src/OctalCode.cpp +++ b/libraries/shared/src/OctalCode.cpp @@ -129,18 +129,17 @@ unsigned char* childOctalCode(const unsigned char* parentOctalCode, char childNu void voxelDetailsForCode(const unsigned char* octalCode, VoxelPositionSize& voxelPositionSize) { float output[3]; memset(&output[0], 0, 3 * sizeof(float)); - float currentScale = 1.0; + float currentScale = 1.0f; if (octalCode) { for (int i = 0; i < numberOfThreeBitSectionsInCode(octalCode); i++) { - currentScale *= 0.5; + currentScale *= 0.5f; int sectionIndex = sectionValue(octalCode + 1 + (BITS_IN_OCTAL * i / BITS_IN_BYTE), (BITS_IN_OCTAL * i) % BITS_IN_BYTE); for (int j = 0; j < BITS_IN_OCTAL; j++) { - output[j] += currentScale * (int)oneAtBit(sectionIndex, (BITS_IN_BYTE - BITS_IN_OCTAL) + j); + output[j] += currentScale * (float)oneAtBit(sectionIndex, (BITS_IN_BYTE - BITS_IN_OCTAL) + j); } - } } voxelPositionSize.x = output[0]; @@ -152,7 +151,7 @@ void voxelDetailsForCode(const unsigned char* octalCode, VoxelPositionSize& voxe void copyFirstVertexForCode(const unsigned char* octalCode, float* output) { memset(output, 0, 3 * sizeof(float)); - float currentScale = 0.5; + float currentScale = 0.5f; for (int i = 0; i < numberOfThreeBitSectionsInCode(octalCode); i++) { int sectionIndex = sectionValue(octalCode + 1 + (3 * i / 8), (3 * i) % 8); @@ -165,12 +164,6 @@ void copyFirstVertexForCode(const unsigned char* octalCode, float* output) { } } -float * firstVertexForCode(const unsigned char* octalCode) { - float * firstVertex = new float[3]; - copyFirstVertexForCode(octalCode, firstVertex); - return firstVertex; -} - OctalCodeComparison compareOctalCodes(const unsigned char* codeA, const unsigned char* codeB) { if (!codeA || !codeB) { return ILLEGAL_CODE; diff --git a/libraries/shared/src/OctalCode.h b/libraries/shared/src/OctalCode.h index 07895ff67f..9229157c3d 100644 --- a/libraries/shared/src/OctalCode.h +++ b/libraries/shared/src/OctalCode.h @@ -43,9 +43,6 @@ const int CHECK_NODE_ONLY = -1; bool isAncestorOf(const unsigned char* possibleAncestor, const unsigned char* possibleDescendent, int descendentsChild = CHECK_NODE_ONLY); -// Note: copyFirstVertexForCode() is preferred because it doesn't allocate memory for the return -// but other than that these do the same thing. -float * firstVertexForCode(const unsigned char* octalCode); void copyFirstVertexForCode(const unsigned char* octalCode, float* output); struct VoxelPositionSize { From 6936d65db9d6b4b046d293aa1caba2bc4ffa4632 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 15:31:52 -0800 Subject: [PATCH 20/28] remove unused *= operator for AABox --- libraries/shared/src/AABox.cpp | 6 ------ libraries/shared/src/AABox.h | 2 -- 2 files changed, 8 deletions(-) diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp index cf02720976..6cb361a4a3 100644 --- a/libraries/shared/src/AABox.cpp +++ b/libraries/shared/src/AABox.cpp @@ -485,9 +485,3 @@ AABox& AABox::operator += (const AABox& box) { } 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 71c1cf0650..9beb0a85f2 100644 --- a/libraries/shared/src/AABox.h +++ b/libraries/shared/src/AABox.h @@ -75,8 +75,6 @@ public: 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: From 373be9529760f7edf9ff42218671cb898da87658 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 15:32:03 -0800 Subject: [PATCH 21/28] entity cubes are in meters --- interface/src/Application.cpp | 2 - interface/src/avatar/ModelReferential.cpp | 26 +++---- interface/src/octree/OctreeFade.cpp | 2 +- interface/src/ui/NodeBounds.cpp | 7 +- interface/src/ui/OctreeStatsDialog.cpp | 1 - .../src/EntityTreeRenderer.cpp | 28 +++---- .../src/RenderableBoxEntityItem.cpp | 6 +- .../src/RenderableLightEntityItem.cpp | 6 +- .../src/RenderableLightEntityItem.h | 2 +- .../src/RenderableModelEntityItem.cpp | 8 +- .../src/RenderableModelEntityItem.h | 2 +- .../src/RenderableSphereEntityItem.cpp | 6 +- .../src/RenderableTextEntityItem.cpp | 4 +- libraries/entities/src/AddEntityOperator.cpp | 4 +- libraries/entities/src/BoxEntityItem.cpp | 1 - .../entities/src/DeleteEntityOperator.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 76 +++++++++---------- libraries/entities/src/EntityItem.h | 40 +++++----- .../entities/src/EntityItemProperties.cpp | 13 +--- libraries/entities/src/EntityItemProperties.h | 5 +- .../entities/src/EntityScriptingInterface.cpp | 2 +- libraries/entities/src/EntitySimulation.cpp | 4 +- libraries/entities/src/EntityTree.cpp | 18 ++--- libraries/entities/src/EntityTree.h | 2 +- libraries/entities/src/EntityTreeElement.cpp | 52 +++++-------- libraries/entities/src/EntityTreeElement.h | 3 +- libraries/entities/src/ModelEntityItem.cpp | 4 +- .../entities/src/MovingEntitiesOperator.cpp | 4 +- .../entities/src/MovingEntitiesOperator.h | 8 +- libraries/entities/src/SphereEntityItem.cpp | 6 +- libraries/entities/src/SphereEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 10 +-- libraries/entities/src/TextEntityItem.h | 4 +- .../entities/src/UpdateEntityOperator.cpp | 14 ++-- libraries/octree/src/Octree.cpp | 29 +++---- libraries/octree/src/Octree.h | 8 ++ libraries/octree/src/OctreeElement.cpp | 39 ++++------ libraries/octree/src/OctreeHeadlessViewer.cpp | 2 - libraries/octree/src/OctreeRenderer.cpp | 3 - libraries/physics/src/EntityMotionState.cpp | 12 +-- tests/octree/src/ModelTests.cpp | 40 +++++----- 41 files changed, 221 insertions(+), 286 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fea6a1fb73..49ac272b35 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2262,7 +2262,6 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverBounds.scale(TREE_SCALE); ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); @@ -2326,7 +2325,6 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverBounds.scale(TREE_SCALE); ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); if (serverFrustumLocation != ViewFrustum::OUTSIDE) { diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index beb378403d..b8acf78cd3 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -31,9 +31,9 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); if (item != NULL) { - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); _refRotation = item->getRotation(); - _refPosition = item->getPositionInMeters(); + _refPosition = item->getPosition(); update(); } } @@ -50,9 +50,9 @@ ModelReferential::ModelReferential(const QUuid& entityID, EntityTree* tree, Avat return; } - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); _refRotation = item->getRotation(); - _refPosition = item->getPositionInMeters(); + _refPosition = item->getPosition(); glm::quat refInvRot = glm::inverse(_refRotation); _rotation = refInvRot * _avatar->getOrientation(); @@ -66,9 +66,9 @@ void ModelReferential::update() { } bool somethingChanged = false; - if (item->getDimensionsInMeters() != _lastRefDimension) { + if (item->getDimensions() != _lastRefDimension) { glm::vec3 oldDimension = _lastRefDimension; - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); _translation *= _lastRefDimension / oldDimension; somethingChanged = true; } @@ -77,8 +77,8 @@ void ModelReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPositionInMeters() != _refPosition || somethingChanged) { - _refPosition = item->getPositionInMeters(); + if (item->getPosition() != _refPosition || somethingChanged) { + _refPosition = item->getPosition(); _avatar->setPosition(_refPosition + _refRotation * _translation, true); } } @@ -107,7 +107,7 @@ JointReferential::JointReferential(Referential* referential, EntityTree* tree, A const EntityItem* item = _tree->findEntityByID(_entityID); const Model* model = getModel(item); if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) { - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); } @@ -127,7 +127,7 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E return; } - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointPositionInWorldFrame(_jointIndex, _refPosition); @@ -145,9 +145,9 @@ void JointReferential::update() { } bool somethingChanged = false; - if (item->getDimensionsInMeters() != _lastRefDimension) { + if (item->getDimensions() != _lastRefDimension) { glm::vec3 oldDimension = _lastRefDimension; - _lastRefDimension = item->getDimensionsInMeters(); + _lastRefDimension = item->getDimensions(); _translation *= _lastRefDimension / oldDimension; somethingChanged = true; } @@ -156,7 +156,7 @@ void JointReferential::update() { _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } - if (item->getPositionInMeters() != _refPosition || somethingChanged) { + if (item->getPosition() != _refPosition || somethingChanged) { model->getJointPositionInWorldFrame(_jointIndex, _refPosition); _avatar->setPosition(_refPosition + _refRotation * _translation, true); } diff --git a/interface/src/octree/OctreeFade.cpp b/interface/src/octree/OctreeFade.cpp index 917bb67124..ad313bdb6d 100644 --- a/interface/src/octree/OctreeFade.cpp +++ b/interface/src/octree/OctreeFade.cpp @@ -42,7 +42,7 @@ void OctreeFade::render() { glDisable(GL_LIGHTING); glPushMatrix(); - glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); + glScalef(1.0f, 1.0f, 1.0f); glTranslatef(voxelDetails.x + voxelDetails.s * 0.5f, voxelDetails.y + voxelDetails.s * 0.5f, voxelDetails.z + voxelDetails.s * 0.5f); diff --git a/interface/src/ui/NodeBounds.cpp b/interface/src/ui/NodeBounds.cpp index 85cbf72953..f0f4d432db 100644 --- a/interface/src/ui/NodeBounds.cpp +++ b/interface/src/ui/NodeBounds.cpp @@ -71,20 +71,19 @@ void NodeBounds::draw() { voxelDetailsForCode(rootCode, rootDetails); serverJurisdictions->unlock(); glm::vec3 location(rootDetails.x, rootDetails.y, rootDetails.z); - location *= (float)TREE_SCALE; - AACube serverBounds(location, rootDetails.s * TREE_SCALE); + AACube serverBounds(location, rootDetails.s); glm::vec3 center = serverBounds.getVertex(BOTTOM_RIGHT_NEAR) + ((serverBounds.getVertex(TOP_LEFT_FAR) - serverBounds.getVertex(BOTTOM_RIGHT_NEAR)) / 2.0f); const float ENTITY_NODE_SCALE = 0.99f; - float scaleFactor = rootDetails.s * TREE_SCALE; + float scaleFactor = rootDetails.s; // Scale by 0.92 - 1.00 depending on the scale of the node. This allows smaller nodes to scale in // a bit and not overlap larger nodes. - scaleFactor *= 0.92 + (rootDetails.s * 0.08); + scaleFactor *= 0.92f + (rootDetails.s * 0.08f); // Scale different node types slightly differently because it's common for them to overlap. if (nodeType == NodeType::EntityServer) { diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index d9c8124180..462811fc1c 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -273,7 +273,6 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverBounds.scale(TREE_SCALE); serverDetails << " jurisdiction: " << qPrintable(rootCodeHex) << " [" diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 1a7d9c8ca7..ebc79250cc 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -48,7 +48,6 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf _displayModelElementProxy(false), _dontDoPrecisionPicking(false) { - std::cout << "adebug " << (void*)(this) << " EntityTreeRenderer ctor" << std::endl; // adebug REGISTER_ENTITY_TYPE_WITH_FACTORY(Model, RenderableModelEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Box, RenderableBoxEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Sphere, RenderableSphereEntityItem::factory) @@ -285,11 +284,11 @@ void EntityTreeRenderer::checkEnterLeaveEntities() { QVector entitiesContainingAvatar; // find the entities near us - static_cast(_tree)->findEntitiesInMeters(avatarPosition, radius, foundEntities); + static_cast(_tree)->findEntities(avatarPosition, radius, foundEntities); // create a list of entities that actually contain the avatar's position foreach(const EntityItem* entity, foundEntities) { - if (entity->containsInMeters(avatarPosition)) { + if (entity->contains(avatarPosition)) { entitiesContainingAvatar << entity->getEntityItemID(); } } @@ -417,8 +416,8 @@ const Model* EntityTreeRenderer::getModelForEntityItem(const EntityItem* entityI } void EntityTreeRenderer::renderElementProxy(EntityTreeElement* entityTreeElement) { - glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter() * (float) TREE_SCALE; - float elementSize = entityTreeElement->getScale() * (float) TREE_SCALE; + glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter(); + float elementSize = entityTreeElement->getScale(); glPushMatrix(); glTranslatef(elementCenter.x, elementCenter.y, elementCenter.z); DependencyManager::get()->renderWireCube(elementSize, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); @@ -477,10 +476,7 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg AACube maxCube = entity->getMaximumAACube(); AACube minCube = entity->getMinimumAACube(); - AABox entityBox = entity->getAABoxInMeters(); - - maxCube.scale((float) TREE_SCALE); - minCube.scale((float) TREE_SCALE); + AABox entityBox = entity->getAABox(); glm::vec3 maxCenter = maxCube.calcCenter(); glm::vec3 minCenter = minCube.calcCenter(); @@ -507,9 +503,9 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glPopMatrix(); - glm::vec3 position = entity->getPositionInMeters(); - glm::vec3 center = entity->getCenterInMeters(); - glm::vec3 dimensions = entity->getDimensionsInMeters(); + glm::vec3 position = entity->getPosition(); + glm::vec3 center = entity->getCenter(); + glm::vec3 dimensions = entity->getDimensions(); glm::quat rotation = entity->getRotation(); glPushMatrix(); @@ -548,7 +544,7 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) if (entityItem->isVisible()) { // render entityItem - AABox entityBox = entityItem->getAABoxInMeters(); + AABox entityBox = entityItem->getAABox(); // TODO: some entity types (like lights) might want to be rendered even // when they are outside of the view frustum... @@ -672,16 +668,10 @@ RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(cons (void**)&intersectedEntity, lockType, &result.accurate, precisionPicking); if (result.intersects && intersectedEntity) { - std::cout << "adebug " << (void*)(this) << " EntityTreeRenderer's tree = " << (void*)(_tree) << std::endl; // adebug - int foo = 0; result.entityID = intersectedEntity->getEntityItemID(); - foo = 1; result.properties = intersectedEntity->getProperties(); - foo = 2; result.intersection = ray.origin + (ray.direction * result.distance); - foo = 3; result.entity = intersectedEntity; - std::cout << "adebug foo = " << foo << std::endl; // adebug } } return result; diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index a80fc91995..f7828806ab 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -25,9 +25,9 @@ EntityItem* RenderableBoxEntityItem::factory(const EntityItemID& entityID, const void RenderableBoxEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableBoxEntityItem::render"); assert(getType() == EntityTypes::Box); - glm::vec3 position = getPositionInMeters(); - glm::vec3 center = getCenterInMeters(); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 position = getPosition(); + glm::vec3 center = getCenter(); + glm::vec3 dimensions = getDimensions(); glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 5889e6b34a..838c9fd8c4 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -26,8 +26,8 @@ EntityItem* RenderableLightEntityItem::factory(const EntityItemID& entityID, con void RenderableLightEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLightEntityItem::render"); assert(getType() == EntityTypes::Light); - glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 position = getPosition(); + glm::vec3 dimensions = getDimensions(); glm::quat rotation = getRotation(); float largestDiameter = glm::max(dimensions.x, dimensions.y, dimensions.z); @@ -67,7 +67,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { #endif }; -bool RenderableLightEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, +bool RenderableLightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.h b/libraries/entities-renderer/src/RenderableLightEntityItem.h index 1ea3e7e884..cfafb85983 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.h @@ -24,7 +24,7 @@ public: virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 6c1d24b845..75c9f07881 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -114,8 +114,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { bool drawAsModel = hasModel(); - glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 position = getPosition(); + glm::vec3 dimensions = getDimensions(); float size = glm::length(dimensions); if (drawAsModel) { @@ -254,13 +254,13 @@ EntityItemProperties RenderableModelEntityItem::getProperties() const { return properties; } -bool RenderableModelEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, +bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { if (!_model) { return true; } - //qDebug() << "RenderableModelEntityItem::findDetailedRayIntersectionInMeters() precisionPicking:" << precisionPicking; + //qDebug() << "RenderableModelEntityItem::findDetailedRayIntersection() precisionPicking:" << precisionPicking; QString extraInfo; return _model->findRayIntersectionAgainstSubMeshes(origin, direction, distance, face, extraInfo, precisionPicking); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 7e20b0bd15..65cded0207 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -44,7 +44,7 @@ public: virtual void render(RenderArgs* args); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 4688e7cc29..083a34c02f 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -26,9 +26,9 @@ EntityItem* RenderableSphereEntityItem::factory(const EntityItemID& entityID, co void RenderableSphereEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableSphereEntityItem::render"); assert(getType() == EntityTypes::Sphere); - glm::vec3 position = getPositionInMeters(); - glm::vec3 center = getCenterInMeters(); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 position = getPosition(); + glm::vec3 center = getCenter(); + glm::vec3 dimensions = getDimensions(); glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 097aef3b38..3586a8c8c5 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -30,8 +30,8 @@ EntityItem* RenderableTextEntityItem::factory(const EntityItemID& entityID, cons void RenderableTextEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableTextEntityItem::render"); assert(getType() == EntityTypes::Text); - glm::vec3 position = getPositionInMeters(); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 position = getPosition(); + glm::vec3 dimensions = getDimensions(); glm::vec3 halfDimensions = dimensions / 2.0f; glm::quat rotation = getRotation(); float leftMargin = 0.1f; diff --git a/libraries/entities/src/AddEntityOperator.cpp b/libraries/entities/src/AddEntityOperator.cpp index 34ccc75030..0844a10ede 100644 --- a/libraries/entities/src/AddEntityOperator.cpp +++ b/libraries/entities/src/AddEntityOperator.cpp @@ -25,7 +25,7 @@ AddEntityOperator::AddEntityOperator(EntityTree* tree, { // caller must have verified existence of newEntity assert(_newEntity); - _newEntityBox = _newEntity->getMaximumAACube().clamp(0.0f, 1.0f); + _newEntityBox = _newEntity->getMaximumAACube().clamp(0.0f, (float)TREE_SCALE); } bool AddEntityOperator::preRecursion(OctreeElement* element) { @@ -43,7 +43,7 @@ bool AddEntityOperator::preRecursion(OctreeElement* element) { if (!_foundNew && element->getAACube().contains(_newEntityBox)) { // If this element is the best fit for the new entity properties, then add/or update it - if (entityTreeElement->bestFitBounds(_newEntityBox)) { + if (entityTreeElement->bestFitBoundsInMeters(_newEntityBox)) { entityTreeElement->addEntityItem(_newEntity); _tree->setContainingElement(_newEntity->getEntityItemID(), entityTreeElement); diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 5256877b44..1e8c811122 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -41,7 +41,6 @@ EntityItemProperties BoxEntityItem::getProperties() const { properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; - std::cout << "adebug end of BoxEntityItem::getProperties()" << std::endl; // adebug return properties; } diff --git a/libraries/entities/src/DeleteEntityOperator.cpp b/libraries/entities/src/DeleteEntityOperator.cpp index 698ef18936..d17e1c66d6 100644 --- a/libraries/entities/src/DeleteEntityOperator.cpp +++ b/libraries/entities/src/DeleteEntityOperator.cpp @@ -60,7 +60,7 @@ bool DeleteEntityOperator::subTreeContainsSomeEntitiesToDelete(OctreeElement* el // If we don't have an old entity, then we don't contain the entity, otherwise // check the bounds if (_entitiesToDelete.size() > 0) { - AACube elementCube = element->getAACube(); + const AACube& elementCube = element->getAACube(); foreach(const EntityToDeleteDetails& details, _entitiesToDelete) { if (elementCube.contains(details.cube)) { containsEntity = true; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index b6381f196d..5a1712a1f6 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -221,12 +221,12 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_PAGED_PROPERTY, // PROP_CUSTOM_PROPERTIES_INCLUDED, - APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPositionInMeters()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensionsInMeters()); // NOTE: PROP_RADIUS obsolete + APPEND_ENTITY_PROPERTY(PROP_POSITION, appendPosition, getPosition()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, appendValue, getDimensions()); // NOTE: PROP_RADIUS obsolete APPEND_ENTITY_PROPERTY(PROP_ROTATION, appendValue, getRotation()); APPEND_ENTITY_PROPERTY(PROP_DENSITY, appendValue, getDensity()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocityInMeters()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravityInMeters()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, appendValue, getVelocity()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, appendValue, getGravity()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, appendValue, getDamping()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, appendValue, getLifetime()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT, appendValue, getScript()); @@ -503,7 +503,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef bytesRead += propertyFlags.getEncodedLength(); bool useMeters = (args.bitstreamVersion == VERSION_ENTITIES_USE_METERS); if (useMeters) { - READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInMeters); + READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePosition); } else { READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePositionInDomainUnits); } @@ -521,7 +521,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } } else { if (useMeters) { - READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInMeters); + READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensions); } else { READ_ENTITY_PROPERTY_SETTER(PROP_DIMENSIONS, glm::vec3, setDimensionsInDomainUnits); } @@ -530,8 +530,8 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY_QUAT_SETTER(PROP_ROTATION, updateRotation); READ_ENTITY_PROPERTY_SETTER(PROP_DENSITY, float, updateDensity); if (useMeters) { - READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInMeters); - READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInMeters); + READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocity); + READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravity); } else { READ_ENTITY_PROPERTY_SETTER(PROP_VELOCITY, glm::vec3, updateVelocityInDomainUnits); READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInDomainUnits); @@ -726,7 +726,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasVelocity()) { // linear damping - glm::vec3 velocity = getVelocityInMeters(); + glm::vec3 velocity = getVelocity(); if (_damping > 0.0f) { velocity *= powf(1.0f - _damping, timeElapsed); #ifdef WANT_DEBUG @@ -738,7 +738,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { } // integrate position forward - glm::vec3 position = getPositionInMeters(); + glm::vec3 position = getPosition(); glm::vec3 newPosition = position + (velocity * timeElapsed); #ifdef WANT_DEBUG @@ -758,19 +758,19 @@ void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasGravity()) { // handle resting on surface case, this is definitely a bit of a hack, and it only works on the // "ground" plane of the domain, but for now it's what we've got - velocity += getGravityInMeters() * timeElapsed; + velocity += getGravity() * timeElapsed; } float speed = glm::length(velocity); const float EPSILON_LINEAR_VELOCITY_LENGTH = 0.001f; // 1mm/sec if (speed < EPSILON_LINEAR_VELOCITY_LENGTH) { - setVelocityInMeters(ENTITY_ITEM_ZERO_VEC3); + setVelocity(ENTITY_ITEM_ZERO_VEC3); if (speed > 0.0f) { _dirtyFlags |= EntityItem::DIRTY_MOTION_TYPE; } } else { - setPositionInMeters(position); - setVelocityInMeters(velocity); + setPosition(position); + setVelocity(velocity); } #ifdef WANT_DEBUG @@ -795,7 +795,6 @@ quint64 EntityItem::getExpiry() const { } EntityItemProperties EntityItem::getProperties() const { - std::cout << "adebug EntityItem::getProperties" << std::endl; // adebug EntityItemProperties properties; properties._id = getID(); properties._idSet = true; @@ -803,12 +802,12 @@ EntityItemProperties EntityItem::getProperties() const { properties._type = getType(); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(position, getPositionInMeters); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(dimensions, getDimensionsInMeters); // NOTE: radius is obsolete + COPY_ENTITY_PROPERTY_TO_PROPERTIES(position, getPosition); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(dimensions, getDimensions); // NOTE: radius is obsolete COPY_ENTITY_PROPERTY_TO_PROPERTIES(rotation, getRotation); COPY_ENTITY_PROPERTY_TO_PROPERTIES(density, getDensity); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(velocity, getVelocityInMeters); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(gravity, getGravityInMeters); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(velocity, getVelocity); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(gravity, getGravity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(damping, getDamping); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifetime, getLifetime); COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript); @@ -825,19 +824,18 @@ EntityItemProperties EntityItem::getProperties() const { properties._defaultSettings = false; - std::cout << "adebug about to delete properties" << std::endl; // adebug return properties; } bool EntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; - SET_ENTITY_PROPERTY_FROM_PROPERTIES(position, updatePositionInMeters); // this will call recalculate collision shape if needed - SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, updateDimensionsInMeters); // NOTE: radius is obsolete + SET_ENTITY_PROPERTY_FROM_PROPERTIES(position, updatePosition); // this will call recalculate collision shape if needed + SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, updateDimensions); // NOTE: radius is obsolete SET_ENTITY_PROPERTY_FROM_PROPERTIES(rotation, updateRotation); SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, updateDensity); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocity, updateVelocityInMeters); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, updateGravityInMeters); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocity, updateVelocity); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, updateGravity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(damping, updateDamping); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, updateLifetime); SET_ENTITY_PROPERTY_FROM_PROPERTIES(script, setScript); @@ -900,7 +898,7 @@ void EntityItem::recordCreationTime() { // TODO: doesn't this need to handle rotation? -glm::vec3 EntityItem::getCenterInMeters() const { +glm::vec3 EntityItem::getCenter() const { return _position + (_dimensions * (glm::vec3(0.5f,0.5f,0.5f) - _registrationPoint)); } @@ -957,7 +955,7 @@ AACube EntityItem::getMinimumAACube() const { return AACube(cornerOfCube, longestSide); } -AABox EntityItem::getAABoxInMeters() const { +AABox EntityItem::getAABox() const { // _position represents the position of the registration point. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; @@ -973,8 +971,8 @@ AABox EntityItem::getAABoxInMeters() const { } AABox EntityItem::getAABoxInDomainUnits() const { - AABox box = getAABoxInMeters(); - box *= 1.0f / (float)TREE_SCALE; + AABox box = getAABox(); + box.scale(1.0f / (float)TREE_SCALE); return box; } @@ -1001,12 +999,12 @@ void EntityItem::setRadius(float value) { // ... radius = cornerToCornerLength / 2.0f // ... cornerToCornerLength = sqrt(3 x maxDimension ^ 2) // ... radius = sqrt(3 x maxDimension ^ 2) / 2.0f; -float EntityItem::getRadiusInMeters() const { +float EntityItem::getRadius() const { return 0.5f * glm::length(_dimensions); } void EntityItem::computeShapeInfo(ShapeInfo& info) const { - info.setParams(getShapeType(), 0.5f * getDimensionsInMeters()); + info.setParams(getShapeType(), 0.5f * getDimensions()); } const float MIN_POSITION_DELTA = 0.0001f; @@ -1019,27 +1017,25 @@ const float MIN_SPIN_DELTA = 0.0003f; void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { glm::vec3 position = value * (float)TREE_SCALE; - updatePositionInMeters(position); + updatePosition(position); } -void EntityItem::updatePositionInMeters(const glm::vec3& value) { +void EntityItem::updatePosition(const glm::vec3& value) { if (glm::distance(_position, value) > MIN_POSITION_DELTA) { _position = value; _dirtyFlags |= EntityItem::DIRTY_POSITION; - std::cout << "adebug updatePositionInMeters = " << _position << std::endl; // adebug } } void EntityItem::updateDimensionsInDomainUnits(const glm::vec3& value) { glm::vec3 dimensions = value * (float)TREE_SCALE; - updateDimensionsInMeters(dimensions); + updateDimensions(dimensions); } -void EntityItem::updateDimensionsInMeters(const glm::vec3& value) { +void EntityItem::updateDimensions(const glm::vec3& value) { if (glm::distance(_dimensions, value) > MIN_DIMENSIONS_DELTA) { _dimensions = value; _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); - std::cout << "adebug updateDimensionsInMeters = " << value << std::endl; // adebug } } @@ -1076,10 +1072,10 @@ void EntityItem::updateMass(float mass) { void EntityItem::updateVelocityInDomainUnits(const glm::vec3& value) { glm::vec3 velocity = value * (float)TREE_SCALE; - updateVelocityInMeters(velocity); + updateVelocity(velocity); } -void EntityItem::updateVelocityInMeters(const glm::vec3& value) { +void EntityItem::updateVelocity(const glm::vec3& value) { if (glm::distance(_velocity, value) > MIN_VELOCITY_DELTA) { if (glm::length(value) < MIN_VELOCITY_DELTA) { _velocity = ENTITY_ITEM_ZERO_VEC3; @@ -1099,10 +1095,10 @@ void EntityItem::updateDamping(float value) { void EntityItem::updateGravityInDomainUnits(const glm::vec3& value) { glm::vec3 gravity = value * (float) TREE_SCALE; - updateGravityInMeters(gravity); + updateGravity(gravity); } -void EntityItem::updateGravityInMeters(const glm::vec3& value) { +void EntityItem::updateGravity(const glm::vec3& value) { if ( glm::distance(_gravity, value) > MIN_GRAVITY_DELTA) { _gravity = value; _dirtyFlags |= EntityItem::DIRTY_VELOCITY; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index a494831317..0f8139eea5 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -22,7 +22,6 @@ #include // for OctreeElement::AppendState #include #include -#include // adebug #include "EntityItemID.h" #include "EntityItemProperties.h" @@ -140,34 +139,33 @@ public: virtual void debugDump() const; virtual bool supportsDetailedRayIntersection() const { return false; } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { return true; } // attributes applicable to all entity types EntityTypes::EntityType getType() const { return _type; } glm::vec3 getPositionInDomainUnits() const { return _position / (float)TREE_SCALE; } /// get position in domain scale units (0.0 - 1.0) - const glm::vec3& getPositionInMeters() const { return _position; } /// get position in meters + const glm::vec3& getPosition() const { return _position; } /// get position in meters /// set position in domain scale units (0.0 - 1.0) void setPositionInDomainUnits(const glm::vec3& value) - { setPositionInMeters(glm::clamp(value, 0.0f, 1.0f) * (float)TREE_SCALE); } - void setPositionInMeters(const glm::vec3& value) { + { setPosition(glm::clamp(value, 0.0f, 1.0f) * (float)TREE_SCALE); } + void setPosition(const glm::vec3& value) { _position = value; - std::cout << "adebug setPosition = " << _position << std::endl; // adebug } - glm::vec3 getCenterInDomainUnits() const { return getCenterInMeters() / (float) TREE_SCALE; } - glm::vec3 getCenterInMeters() const; + glm::vec3 getCenterInDomainUnits() const { return getCenter() / (float) TREE_SCALE; } + glm::vec3 getCenter() const; glm::vec3 getDimensionsInDomainUnits() const { return _dimensions / (float)TREE_SCALE; } /// get dimensions in domain scale units (0.0 - 1.0) - const glm::vec3& getDimensionsInMeters() const { return _dimensions; } /// get dimensions in meters + const glm::vec3& getDimensions() const { return _dimensions; } /// get dimensions in meters /// set dimensions in domain scale units (0.0 - 1.0) virtual void setDimensionsInDomainUnits(const glm::vec3& value) { _dimensions = glm::abs(value) * (float)TREE_SCALE; } /// set dimensions in meter units (0.0 - TREE_SCALE) - virtual void setDimensionsInMeters(const glm::vec3& value) { _dimensions = glm::abs(value); } + virtual void setDimensions(const glm::vec3& value) { _dimensions = glm::abs(value); } const glm::quat& getRotation() const { return _rotation; } void setRotation(const glm::quat& rotation) { _rotation = rotation; } @@ -185,15 +183,15 @@ public: float getDensity() const { return _density; } glm::vec3 getVelocityInDomainUnits() const { return _velocity / (float)TREE_SCALE; } /// velocity in domain scale units (0.0-1.0) per second - const glm::vec3 getVelocityInMeters() const { return _velocity; } /// get velocity in meters + const glm::vec3 getVelocity() const { return _velocity; } /// get velocity in meters void setVelocityInDomainUnits(const glm::vec3& value) { _velocity = value * (float)TREE_SCALE; } /// velocity in domain scale units (0.0-1.0) per second - void setVelocityInMeters(const glm::vec3& value) { _velocity = value; } /// velocity in meters + void setVelocity(const glm::vec3& value) { _velocity = value; } /// velocity in meters bool hasVelocity() const { return _velocity != ENTITY_ITEM_ZERO_VEC3; } glm::vec3 getGravityInDomainUnits() const { return _gravity / (float)TREE_SCALE; } /// gravity in domain scale units (0.0-1.0) per second squared - const glm::vec3& getGravityInMeters() const { return _gravity; } /// get gravity in meters + const glm::vec3& getGravity() const { return _gravity; } /// get gravity in meters void setGravityInDomainUnits(const glm::vec3& value) { _gravity = value * (float)TREE_SCALE; } /// gravity in domain scale units (0.0-1.0) per second squared - void setGravityInMeters(const glm::vec3& value) { _gravity = value; } /// gravity in meters + void setGravity(const glm::vec3& value) { _gravity = value; } /// gravity in meters bool hasGravity() const { return _gravity != ENTITY_ITEM_ZERO_VEC3; } float getDamping() const { return _damping; } @@ -217,7 +215,7 @@ public: // position, size, and bounds related helpers 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 world-frame (meters) AABox getAABoxInDomainUnits() const; /// axis aligned bounding box in domain scale units (0.0 - 1.0) const QString& getScript() const { return _script; } @@ -254,9 +252,9 @@ public: void setUserData(const QString& value) { _userData = value; } // TODO: get rid of users of getRadius()... - float getRadiusInMeters() const; + 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 bool containsInDomainUnits(const glm::vec3& point) const { return getAABoxInDomainUnits().contains(point); } virtual void computeShapeInfo(ShapeInfo& info) const; @@ -265,17 +263,17 @@ public: // updateFoo() methods to be used when changes need to be accumulated in the _dirtyFlags void updatePositionInDomainUnits(const glm::vec3& value); - void updatePositionInMeters(const glm::vec3& value); + void updatePosition(const glm::vec3& value); void updateDimensionsInDomainUnits(const glm::vec3& value); - void updateDimensionsInMeters(const glm::vec3& value); + void updateDimensions(const glm::vec3& value); void updateRotation(const glm::quat& rotation); void updateDensity(float value); void updateMass(float value); void updateVelocityInDomainUnits(const glm::vec3& value); - void updateVelocityInMeters(const glm::vec3& value); + void updateVelocity(const glm::vec3& value); void updateDamping(float value); void updateGravityInDomainUnits(const glm::vec3& value); - void updateGravityInMeters(const glm::vec3& value); + void updateGravity(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); void updateAngularDamping(float value); void updateIgnoreForCollisions(bool value); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index c6414f620b..53a39e1a99 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -80,7 +80,6 @@ EntityItemProperties::EntityItemProperties() : } EntityItemProperties::~EntityItemProperties() { - std::cout << "adebug delete properties" << std::endl; // adebug } void EntityItemProperties::setSittingPoints(const QVector& sittingPoints) { @@ -296,7 +295,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine) cons sittingPoints.setProperty("length", _sittingPoints.size()); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(sittingPoints, sittingPoints); // gettable, but not settable - AABox aaBox = getAABoxInMeters(); + AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); QScriptValue bottomRightNear = vec3toScriptValue(engine, aaBox.getCorner()); QScriptValue topFarLeft = vec3toScriptValue(engine, aaBox.calcTopFarLeft()); @@ -821,16 +820,10 @@ void EntityItemProperties::markAllChanged() { _shapeTypeChanged = true; } -AACube EntityItemProperties::getMaximumAACubeInTreeUnits() const { - AACube maxCube = getMaximumAACubeInMeters(); - maxCube.scale(1.0f / (float)TREE_SCALE); - return maxCube; -} - /// The maximum bounding cube for the entity, independent of it's rotation. /// This accounts for the registration point (upon which rotation occurs around). /// -AACube EntityItemProperties::getMaximumAACubeInMeters() const { +AACube EntityItemProperties::getMaximumAACube() const { // * we know that the position is the center of rotation glm::vec3 centerOfRotation = _position; // also where _registration point is @@ -854,7 +847,7 @@ AACube EntityItemProperties::getMaximumAACubeInMeters() const { } // The minimum bounding box for the entity. -AABox EntityItemProperties::getAABoxInMeters() const { +AABox EntityItemProperties::getAABox() const { // _position represents the position of the registration point. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 9bf3c93c2b..bf10fd4c87 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -129,9 +129,8 @@ public: /// used by EntityScriptingInterface to return EntityItemProperties for unknown models void setIsUnknownID() { _id = UNKNOWN_ENTITY_ID; _idSet = true; } - AACube getMaximumAACubeInTreeUnits() const; - AACube getMaximumAACubeInMeters() const; - AABox getAABoxInMeters() const; + AACube getMaximumAACube() const; + AABox getAABox() const; void debugDump() const; void setLastEdited(quint64 usecTime); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 24bad08b6b..5ef0db57ec 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -206,7 +206,7 @@ QVector EntityScriptingInterface::findEntities(const glm::vec3& ce if (_entityTree) { _entityTree->lockForRead(); QVector entities; - _entityTree->findEntitiesInMeters(center, radius, entities); + _entityTree->findEntities(center, radius, entities); _entityTree->unlock(); foreach (const EntityItem* entity, entities) { diff --git a/libraries/entities/src/EntitySimulation.cpp b/libraries/entities/src/EntitySimulation.cpp index f7d6c55803..758cd6771a 100644 --- a/libraries/entities/src/EntitySimulation.cpp +++ b/libraries/entities/src/EntitySimulation.cpp @@ -87,7 +87,7 @@ void EntitySimulation::sortEntitiesThatMoved() { // External changes to entity position/shape are expected to be sorted outside of the EntitySimulation. PerformanceTimer perfTimer("sortingEntities"); MovingEntitiesOperator moveOperator(_entityTree); - AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), 1.0f); + AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), (float)TREE_SCALE); QSet::iterator itemItr = _entitiesToBeSorted.begin(); while (itemItr != _entitiesToBeSorted.end()) { EntityItem* entity = *itemItr; @@ -150,7 +150,7 @@ void EntitySimulation::entityChanged(EntityItem* entity) { bool wasRemoved = false; uint32_t dirtyFlags = entity->getDirtyFlags(); if (dirtyFlags & EntityItem::DIRTY_POSITION) { - AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), 1.0f); + AACube domainBounds(glm::vec3(0.0f,0.0f,0.0f), (float)TREE_SCALE); AACube newCube = entity->getMaximumAACube(); if (!domainBounds.touches(newCube)) { qDebug() << "Entity " << entity->getEntityItemID() << " moved out of domain bounds."; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 9e75615117..ba9a4c61e8 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -424,9 +424,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) EntityTreeElement* entityTreeElement = static_cast(element); glm::vec3 penetration; - AACube cube = entityTreeElement->getAACube(); - cube.scale((float)TREE_SCALE); - bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); + bool sphereIntersection = entityTreeElement->getAACube().findSpherePenetration(args->position, args->targetRadius, penetration); // If this entityTreeElement contains the point, then search it... if (sphereIntersection) { @@ -434,7 +432,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) // we may have gotten NULL back, meaning no entity was available if (thisClosestEntity) { - glm::vec3 entityPosition = thisClosestEntity->getPositionInMeters(); + glm::vec3 entityPosition = thisClosestEntity->getPosition(); float distanceFromPointToEntity = glm::distance(entityPosition, args->position); // If we're within our target radius @@ -457,7 +455,6 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) } const EntityItem* EntityTree::findClosestEntity(glm::vec3 position, float targetRadius) { - // position and targetRadius are in meters, so we need to convert to TreeUnits in FindNearPointArgs FindNearPointArgs args = { position, targetRadius, false, NULL, FLT_MAX }; lockForRead(); // NOTE: This should use recursion, since this is a spatial operation @@ -477,9 +474,7 @@ public: bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) { FindAllNearPointArgs* args = static_cast(extraData); glm::vec3 penetration; - AACube cube = element->getAACube(); - cube.scale((float)TREE_SCALE); - bool sphereIntersection = cube.findSpherePenetration(args->position, args->targetRadius, penetration); + bool sphereIntersection = element->getAACube().findSpherePenetration(args->position, args->targetRadius, penetration); // If this element contains the point, then search it... if (sphereIntersection) { @@ -493,8 +488,7 @@ bool EntityTree::findInSphereOperation(OctreeElement* element, void* extraData) } // NOTE: assumes caller has handled locking -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 +void EntityTree::findEntities(const glm::vec3& center, float radius, QVector& foundEntities) { FindAllNearPointArgs args = { center, radius }; // NOTE: This should use recursion, since this is a spatial operation recurseTreeWithOperation(findInSphereOperation, &args); @@ -515,9 +509,7 @@ public: bool EntityTree::findInCubeOperation(OctreeElement* element, void* extraData) { FindEntitiesInCubeArgs* args = static_cast(extraData); - AACube elementCube = element->getAACube(); - elementCube.scale((float)TREE_SCALE); - if (elementCube.touches(args->_cube)) { + if (element->getAACube().touches(args->_cube)) { EntityTreeElement* entityTreeElement = static_cast(element); entityTreeElement->getEntities(args->_cube, args->_foundEntities); return true; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 852d07d20f..d897e6628e 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -109,7 +109,7 @@ public: /// \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 findEntitiesInMeters(const glm::vec3& center, float radius, QVector& foundEntities); + void findEntities(const glm::vec3& center, float radius, QVector& foundEntities); /// finds all entities that touch a cube /// \param cube the query cube in world-frame (meters) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index e32434b4c6..fbd377cfeb 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -22,15 +22,9 @@ EntityTreeElement::EntityTreeElement(unsigned char* octalCode) : OctreeElement() }; EntityTreeElement::~EntityTreeElement() { - int bar = 0; _octreeMemoryUsage -= sizeof(EntityTreeElement); - bar = 1; - std::cout << "adebug EntityTreeElement " << (void*)(this) << " deletes old entityItems = " << (void*)(_entityItems) << std::endl; // adebug delete _entityItems; - bar = 2; _entityItems = NULL; - bar = 3; - std::cout << "adebug bar = " << bar << std::endl; // adebug } // This will be called primarily on addChildAt(), which means we're adding a child of our @@ -45,7 +39,6 @@ OctreeElement* EntityTreeElement::createNewElement(unsigned char* octalCode) { void EntityTreeElement::init(unsigned char* octalCode) { OctreeElement::init(octalCode); _entityItems = new QList; - std::cout << "adebug EntityTreeElement " << (void*)(this) << " gets new entityItems = " << (void*)(_entityItems) << std::endl; // adebug _octreeMemoryUsage += sizeof(EntityTreeElement); } @@ -57,7 +50,7 @@ EntityTreeElement* EntityTreeElement::addChildAtIndex(int index) { void EntityTreeElement::debugExtraEncodeData(EncodeBitstreamParams& params) const { qDebug() << "EntityTreeElement::debugExtraEncodeData()... "; - qDebug() << " element:" << getAACube(); + qDebug() << " element:" << _cube; OctreeElementExtraEncodeData* extraEncodeData = params.extraEncodeData; assert(extraEncodeData); // EntityTrees always require extra encode data on their encoding passes @@ -166,7 +159,7 @@ void EntityTreeElement::elementEncodeComplete(EncodeBitstreamParams& params, Oct const bool wantDebug = false; if (wantDebug) { - qDebug() << "EntityTreeElement::elementEncodeComplete() element:" << getAACube(); + qDebug() << "EntityTreeElement::elementEncodeComplete() element:" << _cube; } OctreeElementExtraEncodeData* extraEncodeData = params.extraEncodeData; @@ -201,7 +194,7 @@ void EntityTreeElement::elementEncodeComplete(EncodeBitstreamParams& params, Oct = static_cast(extraEncodeData->value(childElement)); if (wantDebug) { - qDebug() << "checking child: " << childElement->getAACube(); + qDebug() << "checking child: " << childElement->_cube; qDebug() << " childElement->isLeaf():" << childElement->isLeaf(); qDebug() << " childExtraEncodeData->elementCompleted:" << childExtraEncodeData->elementCompleted; qDebug() << " childExtraEncodeData->subtreeCompleted:" << childExtraEncodeData->subtreeCompleted; @@ -222,7 +215,7 @@ void EntityTreeElement::elementEncodeComplete(EncodeBitstreamParams& params, Oct } if (wantDebug) { - qDebug() << "for this element: " << getAACube(); + qDebug() << "for this element: " << _cube; qDebug() << " WAS elementCompleted:" << thisExtraEncodeData->elementCompleted; qDebug() << " WAS subtreeCompleted:" << thisExtraEncodeData->subtreeCompleted; } @@ -309,7 +302,6 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData // the entity may not be in view and then in view a frame later, let the client side handle it's view // frustum culling on rendering. AACube entityCube = entity->getMaximumAACube(); - entityCube.scale(TREE_SCALE); if (params.viewFrustum->cubeInFrustum(entityCube) == ViewFrustum::OUTSIDE) { includeThisEntity = false; // out of view, don't include it } @@ -448,14 +440,14 @@ bool EntityTreeElement::bestFitBounds(const AABox& bounds) const { } bool EntityTreeElement::containsBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const { - glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, 1.0f); - glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, 1.0f); + glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, (float)TREE_SCALE); + glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, (float)TREE_SCALE); return _cube.contains(clampedMin) && _cube.contains(clampedMax); } bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3& maxPoint) const { - glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, 1.0f); - glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, 1.0f); + glm::vec3 clampedMin = glm::clamp(minPoint, 0.0f, (float)TREE_SCALE); + glm::vec3 clampedMax = glm::clamp(maxPoint, 0.0f, (float)TREE_SCALE); if (_cube.contains(clampedMin) && _cube.contains(clampedMax)) { @@ -476,7 +468,7 @@ bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3 return false; } -bool EntityTreeElement::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, +bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { @@ -492,7 +484,7 @@ bool EntityTreeElement::findDetailedRayIntersectionInMeters(const glm::vec3& ori while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - AABox entityBox = entity->getAABoxInMeters(); + AABox entityBox = entity->getAABox(); float localDistance; BoxFace localFace; @@ -501,11 +493,11 @@ bool EntityTreeElement::findDetailedRayIntersectionInMeters(const glm::vec3& ori // extents is the entity relative, scaled, centered extents of the entity glm::mat4 rotation = glm::mat4_cast(entity->getRotation()); - glm::mat4 translation = glm::translate(entity->getPositionInMeters()); + glm::mat4 translation = glm::translate(entity->getPosition()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = entity->getDimensionsInMeters(); + glm::vec3 dimensions = entity->getDimensions(); glm::vec3 registrationPoint = entity->getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); @@ -520,7 +512,7 @@ bool EntityTreeElement::findDetailedRayIntersectionInMeters(const glm::vec3& ori if (localDistance < distance) { // now ask the entity if we actually intersect if (entity->supportsDetailedRayIntersection()) { - if (entity->findDetailedRayIntersectionInMeters(origin, direction, keepSearching, element, localDistance, + if (entity->findDetailedRayIntersection(origin, direction, keepSearching, element, localDistance, localFace, intersectedObject, precisionPicking)) { if (localDistance < distance) { @@ -556,8 +548,8 @@ bool EntityTreeElement::findSpherePenetration(const glm::vec3& center, float rad QList::const_iterator entityEnd = _entityItems->end(); while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - glm::vec3 entityCenter = entity->getPositionInMeters(); - float entityRadius = entity->getRadiusInMeters(); + glm::vec3 entityCenter = entity->getPosition(); + float entityRadius = entity->getRadius(); // don't penetrate yourself if (entityCenter == center && entityRadius == radius) { @@ -592,7 +584,7 @@ const EntityItem* EntityTreeElement::getClosestEntity(glm::vec3 position) const float closestEntityDistance = FLT_MAX; uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { - float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPositionInMeters()); + float distanceToEntity = glm::distance(position, (*_entityItems)[i]->getPosition()); if (distanceToEntity < closestEntityDistance) { closestEntity = (*_entityItems)[i]; } @@ -605,8 +597,8 @@ void EntityTreeElement::getEntities(const glm::vec3& searchPosition, float searc uint16_t numberOfEntities = _entityItems->size(); for (uint16_t i = 0; i < numberOfEntities; i++) { const EntityItem* entity = (*_entityItems)[i]; - float distance = glm::length(entity->getPositionInMeters() - searchPosition); - if (distance < searchRadius + entity->getRadiusInMeters()) { + float distance = glm::length(entity->getPosition() - searchPosition); + if (distance < searchRadius + entity->getRadius()) { foundEntities.push_back(entity); } } @@ -619,11 +611,11 @@ void EntityTreeElement::getEntities(const AACube& box, QVector& fou AACube entityCube; while(entityItr != entityEnd) { EntityItem* entity = (*entityItr); - float radius = entity->getRadiusInMeters(); + float radius = entity->getRadius(); // NOTE: we actually do cube-cube collision queries here, which is sloppy but good enough for now // TODO: decide whether to replace entityCube-cube query with sphere-cube (requires a square root // but will be slightly more accurate). - entityCube.setBox(entity->getPositionInMeters() - glm::vec3(radius), 2.0f * radius); + entityCube.setBox(entity->getPosition() - glm::vec3(radius), 2.0f * radius); if (entityCube.touches(box)) { foundEntities.push_back(entity); } @@ -830,9 +822,7 @@ bool EntityTreeElement::pruneChildren() { void EntityTreeElement::debugDump() { qDebug() << "EntityTreeElement..."; - AACube temp = getAACube(); - temp.scale((float)TREE_SCALE); - qDebug() << " cube:" << temp; + qDebug() << " cube:" << _cube; qDebug() << " has child elements:" << getChildCount(); if (_entityItems->size()) { qDebug() << " has entities:" << _entityItems->size(); diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index ad91010b0b..0b28dd30d0 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -73,7 +73,6 @@ public: class EntityTreeElement : public OctreeElement { friend class EntityTree; // to allow createElement to new us... - EntityTreeElement(); EntityTreeElement(unsigned char* octalCode = NULL); virtual OctreeElement* createNewElement(unsigned char* octalCode = NULL); @@ -136,7 +135,7 @@ public: virtual bool deleteApproved() const { return !hasEntities(); } virtual bool canRayIntersect() const { return hasEntities(); } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking, float distanceToElementCube); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 5a95fe4e33..f30d43c7d5 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -255,8 +255,8 @@ void ModelEntityItem::update(const quint64& now) { void ModelEntityItem::debugDump() const { qDebug() << "ModelEntityItem id:" << getEntityItemID(); qDebug() << " edited ago:" << getEditedAgo(); - qDebug() << " position:" << getPositionInMeters(); - qDebug() << " dimensions:" << getDimensionsInMeters(); + qDebug() << " position:" << getPosition(); + qDebug() << " dimensions:" << getDimensions(); qDebug() << " model URL:" << getModelURL(); } diff --git a/libraries/entities/src/MovingEntitiesOperator.cpp b/libraries/entities/src/MovingEntitiesOperator.cpp index 48ba8e4ec2..7cace205e1 100644 --- a/libraries/entities/src/MovingEntitiesOperator.cpp +++ b/libraries/entities/src/MovingEntitiesOperator.cpp @@ -51,7 +51,7 @@ MovingEntitiesOperator::~MovingEntitiesOperator() { void MovingEntitiesOperator::addEntityToMoveList(EntityItem* entity, const AACube& newCube) { EntityTreeElement* oldContainingElement = _tree->getContainingElement(entity->getEntityItemID()); - AABox newCubeClamped = newCube.clamp(0.0f, 1.0f); + AABox newCubeClamped = newCube.clamp(0.0f, (float)TREE_SCALE); if (_wantDebug) { qDebug() << "MovingEntitiesOperator::addEntityToMoveList() -----------------------------"; @@ -114,7 +114,7 @@ bool MovingEntitiesOperator::shouldRecurseSubTree(OctreeElement* element) { // If we don't have an old entity, then we don't contain the entity, otherwise // check the bounds if (_entitiesToMove.size() > 0) { - AACube elementCube = element->getAACube(); + const AACube& elementCube = element->getAACube(); int detailIndex = 0; foreach(const EntityToMoveDetails& details, _entitiesToMove) { diff --git a/libraries/entities/src/MovingEntitiesOperator.h b/libraries/entities/src/MovingEntitiesOperator.h index fefda3328e..760b001081 100644 --- a/libraries/entities/src/MovingEntitiesOperator.h +++ b/libraries/entities/src/MovingEntitiesOperator.h @@ -15,11 +15,11 @@ class EntityToMoveDetails { public: EntityItem* entity; - AACube oldCube; - AACube newCube; - AABox newCubeClamped; + AACube oldCube; // meters + AACube newCube; // meters + AABox newCubeClamped; // meters EntityTreeElement* oldContainingElement; - AACube oldContainingElementCube; + AACube oldContainingElementCube; // meters bool oldFound; bool newFound; }; diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index e21a2573a2..49149e78ae 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -91,13 +91,13 @@ void SphereEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBi APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); } -bool SphereEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, +bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { // determine the ray in the frame of the entity transformed from a unit sphere - glm::mat4 translation = glm::translate(getPositionInMeters()); + glm::mat4 translation = glm::translate(getPosition()); glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 scale = glm::scale(getDimensionsInMeters()); + glm::mat4 scale = glm::scale(getDimensions()); glm::mat4 registration = glm::translate(glm::vec3(0.5f, 0.5f, 0.5f) - getRegistrationPoint()); glm::mat4 entityToWorldMatrix = translation * rotation * scale * registration; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index f8419e75b9..f79a2db7ff 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -56,7 +56,7 @@ public: virtual ShapeType getShapeType() const { return SHAPE_TYPE_SPHERE; } virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index d008bceccc..2b35ee9a59 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -42,7 +42,7 @@ TextEntityItem::TextEntityItem(const EntityItemID& entityItemID, const EntityIte const float TEXT_ENTITY_ITEM_FIXED_DEPTH = 0.01f; -void TextEntityItem::setDimensionsInMeters(const glm::vec3& value) { +void TextEntityItem::setDimensions(const glm::vec3& value) { // NOTE: Text Entities always have a "depth" of 1cm. _dimensions = glm::vec3(value.x, value.y, TEXT_ENTITY_ITEM_FIXED_DEPTH); } @@ -128,7 +128,7 @@ void TextEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits } -bool TextEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, +bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { @@ -142,7 +142,7 @@ bool TextEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin const glm::vec3 UNROTATED_NORMAL(0.0f, 0.0f, -1.0f); glm::vec3 normal = _rotation * UNROTATED_NORMAL; plane.setNormal(normal); - plane.setPoint(getPositionInMeters()); // the position is definitely a point on our plane + plane.setPoint(getPosition()); // the position is definitely a point on our plane bool intersects = plane.findRayIntersection(rayInfo); @@ -151,11 +151,11 @@ bool TextEntityItem::findDetailedRayIntersectionInMeters(const glm::vec3& origin // now we know the point the ray hit our plane glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 translation = glm::translate(getPositionInMeters()); + glm::mat4 translation = glm::translate(getPosition()); glm::mat4 entityToWorldMatrix = translation * rotation; glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - glm::vec3 dimensions = getDimensionsInMeters(); + glm::vec3 dimensions = getDimensions(); glm::vec3 registrationPoint = getRegistrationPoint(); glm::vec3 corner = -(dimensions * registrationPoint); AABox entityFrameBox(corner, dimensions); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 1ee9c2c194..044975bdc8 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -23,7 +23,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensionsInMeters(const glm::vec3& value); + virtual void setDimensions(const glm::vec3& value); virtual void setDimensionsInDomainUnits(const glm::vec3& value); virtual ShapeType getShapeType() const { return SHAPE_TYPE_BOX; } @@ -47,7 +47,7 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData); virtual bool supportsDetailedRayIntersection() const { return true; } - virtual bool findDetailedRayIntersectionInMeters(const glm::vec3& origin, const glm::vec3& direction, + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const; diff --git a/libraries/entities/src/UpdateEntityOperator.cpp b/libraries/entities/src/UpdateEntityOperator.cpp index 43052c6a73..f93be2f563 100644 --- a/libraries/entities/src/UpdateEntityOperator.cpp +++ b/libraries/entities/src/UpdateEntityOperator.cpp @@ -46,7 +46,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, // which can handle all potential rotations? // the getMaximumAACube is the relaxed form. _oldEntityCube = _existingEntity->getMaximumAACube(); - _oldEntityBox = _oldEntityCube.clamp(0.0f, 1.0f); // clamp to domain bounds + _oldEntityBox = _oldEntityCube.clamp(0.0f, (float)TREE_SCALE); // clamp to domain bounds // If the old properties doesn't contain the properties required to calculate a bounding box, // get them from the existing entity. Registration point is required to correctly calculate @@ -59,8 +59,8 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, // get the old property value and set it in our properties in order for our bounds // calculations to work. if (_properties.containsPositionChange() && !_properties.containsDimensionsChange()) { - glm::vec3 oldDimensionsInMeters = _existingEntity->getDimensionsInMeters(); - _properties.setDimensions(oldDimensionsInMeters); + glm::vec3 oldDimensions= _existingEntity->getDimensions(); + _properties.setDimensions(oldDimensions); if (_wantDebug) { qDebug() << " ** setting properties dimensions - had position change, no dimension change **"; @@ -68,8 +68,8 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, } if (!_properties.containsPositionChange() && _properties.containsDimensionsChange()) { - glm::vec3 oldPositionInMeters = _existingEntity->getPositionInMeters(); - _properties.setPosition(oldPositionInMeters); + glm::vec3 oldPosition= _existingEntity->getPosition(); + _properties.setPosition(oldPosition); if (_wantDebug) { qDebug() << " ** setting properties position - had dimensions change, no position change **"; @@ -114,7 +114,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, } } else { - _newEntityCube = _properties.getMaximumAACubeInTreeUnits(); + _newEntityCube = _properties.getMaximumAACube(); _removeOld = true; // our properties are going to move us, so remember this for later processing if (_wantDebug) { @@ -122,7 +122,7 @@ UpdateEntityOperator::UpdateEntityOperator(EntityTree* tree, } } - _newEntityBox = _newEntityCube.clamp(0.0f, 1.0f); // clamp to domain bounds + _newEntityBox = _newEntityCube.clamp(0.0f, (float)TREE_SCALE); // clamp to domain bounds if (_wantDebug) { diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 3b43a4a5d2..6b8f8c31e8 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -274,7 +274,7 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch if (destinationElement->getScale() < SCALE_AT_DANGEROUSLY_DEEP_RECURSION) { qDebug() << "UNEXPECTED: readElementData() destination element is unreasonably small [" - << destinationElement->getScale() * (float)TREE_SCALE << " meters] " + << destinationElement->getScale() << " meters] " << " Discarding " << bytesAvailable << " remaining bytes."; return bytesAvailable; // assume we read the entire buffer... } @@ -748,12 +748,8 @@ public: bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { SphereArgs* args = static_cast(extraData); - // the details in args is in meters (world-frame) so we have to scale the element cube up - AACube box = element->getAACube(); - box.scale((float)TREE_SCALE); - // coarse check against bounds - if (!box.expandedContains(args->center, args->radius)) { + if (!element->getAACube().expandedContains(args->center, args->radius)) { return false; } if (element->hasContent()) { @@ -837,14 +833,12 @@ bool findCapsulePenetrationOp(OctreeElement* element, void* extraData) { CapsuleArgs* args = static_cast(extraData); // coarse check against bounds - AACube box = element->getAACube(); - box.scale((float)TREE_SCALE); - if (!box.expandedIntersectsSegment(args->start, args->end, args->radius)) { + if (!element->getAACube().expandedIntersectsSegment(args->start, args->end, args->radius)) { return false; } if (element->hasContent()) { glm::vec3 nodePenetration; - if (box.findCapsulePenetration(args->start, args->end, args->radius, nodePenetration)) { + if (element->getAACube().findCapsulePenetration(args->start, args->end, args->radius, nodePenetration)) { args->penetration = addPenetrations(args->penetration, nodePenetration); args->found = true; } @@ -872,8 +866,7 @@ bool findContentInCubeOp(OctreeElement* element, void* extraData) { ContentArgs* args = static_cast(extraData); // coarse check against bounds - AACube cube = element->getAACube(); - cube.scale(TREE_SCALE); + const AACube& cube = element->getAACube(); if (!cube.touches(args->cube)) { return false; } @@ -940,8 +933,7 @@ public: // Find the smallest colored voxel enclosing a point (if there is one) bool getElementEnclosingOperation(OctreeElement* element, void* extraData) { GetElementEnclosingArgs* args = static_cast(extraData); - AACube elementBox = element->getAACube(); - if (elementBox.contains(args->point)) { + if (element->getAACube().contains(args->point)) { if (element->hasContent() && element->isLeaf()) { // we've reached a solid leaf containing the point, return the element. args->element = element; @@ -1207,9 +1199,8 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // If the user also asked for occlusion culling, check if this element is occluded, but only if it's not a leaf. // leaf occlusion is handled down below when we check child nodes if (params.wantOcclusionCulling && !element->isLeaf()) { - AACube voxelBox = element->getAACube(); - voxelBox.scale(TREE_SCALE); - OctreeProjectedPolygon* voxelPolygon = new OctreeProjectedPolygon(params.viewFrustum->getProjectedPolygon(voxelBox)); + OctreeProjectedPolygon* voxelPolygon = + new OctreeProjectedPolygon(params.viewFrustum->getProjectedPolygon(element->getAACube())); // In order to check occlusion culling, the shadow has to be "all in view" otherwise, we will ignore occlusion // culling and proceed as normal @@ -1360,10 +1351,8 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, if (params.wantOcclusionCulling && childElement->isLeaf()) { // Don't check occlusion here, just add them to our distance ordered array... - AACube voxelBox = childElement->getAACube(); - voxelBox.scale(TREE_SCALE); OctreeProjectedPolygon* voxelPolygon = new OctreeProjectedPolygon( - params.viewFrustum->getProjectedPolygon(voxelBox)); + params.viewFrustum->getProjectedPolygon(childElement->getAACube())); // In order to check occlusion culling, the shadow has to be "all in view" otherwise, we ignore occlusion // culling and proceed as normal diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 8774ebe55b..a2265e38ed 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -270,6 +270,9 @@ public: void recurseTreeWithOperation(RecurseOctreeOperation operation, void* extraData = NULL); void recurseTreeWithPostOperation(RecurseOctreeOperation operation, void* extraData = NULL); + /// \param operation type of operation + /// \param point point in world-frame (meters) + /// \param extraData hook for user data to be interpreted by special context void recurseTreeWithOperationDistanceSorted(RecurseOctreeOperation operation, const glm::vec3& point, void* extraData = NULL); @@ -308,8 +311,13 @@ public: bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); + /// \param cube query cube in world-frame (meters) + /// \param[out] cubes list of cubes (world-frame) of child elements that have content bool findContentInCube(const AACube& cube, CubeList& cubes); + /// \param point query point in world-frame (meters) + /// \param lockType how to lock the tree (Lock, TryLock, NoLock) + /// \param[out] accurateResult pointer to output result, will be set "true" or "false" if non-null OctreeElement* getElementEnclosingPoint(const glm::vec3& point, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 5e6fd0dde3..c8564ee5cb 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -194,14 +194,14 @@ void OctreeElement::setShouldRender(bool shouldRender) { } void OctreeElement::calculateAACube() { - glm::vec3 corner; - // copy corner into cube - copyFirstVertexForCode(getOctalCode(),(float*)&corner); + glm::vec3 corner; + copyFirstVertexForCode(getOctalCode(), (float*)&corner); // this tells you the "size" of the voxel - float voxelScale = 1 / powf(2, numberOfThreeBitSectionsInCode(getOctalCode())); - _cube.setBox(corner,voxelScale); + float voxelScale = (float)TREE_SCALE / powf(2.0f, numberOfThreeBitSectionsInCode(getOctalCode())); + corner *= (float)TREE_SCALE; + _cube.setBox(corner, voxelScale); } void OctreeElement::deleteChildAtIndex(int childIndex) { @@ -1221,9 +1221,7 @@ float OctreeElement::getEnclosingRadius() const { } ViewFrustum::location OctreeElement::inFrustum(const ViewFrustum& viewFrustum) const { - AACube cube = _cube; // use temporary cube so we can scale it - cube.scale(TREE_SCALE); - return viewFrustum.cubeInFrustum(cube); + return viewFrustum.cubeInFrustum(_cube); } // There are two types of nodes for which we want to "render" @@ -1257,16 +1255,13 @@ bool OctreeElement::calculateShouldRender(const ViewFrustum* viewFrustum, float // does as much math as possible in voxel scale and then scales up to TREE_SCALE at end float OctreeElement::furthestDistanceToCamera(const ViewFrustum& viewFrustum) const { glm::vec3 furthestPoint; - AACube cube = getAACube(); - cube.scale((float)TREE_SCALE); - viewFrustum.getFurthestPointFromCamera(cube, furthestPoint); + viewFrustum.getFurthestPointFromCamera(_cube, furthestPoint); glm::vec3 temp = viewFrustum.getPosition() - furthestPoint; - float distanceToFurthestPoint = sqrtf(glm::dot(temp, temp)); - return distanceToFurthestPoint; + return sqrtf(glm::dot(temp, temp)); } float OctreeElement::distanceToCamera(const ViewFrustum& viewFrustum) const { - glm::vec3 center = _cube.calcCenter() * (float)TREE_SCALE; + glm::vec3 center = _cube.calcCenter(); glm::vec3 temp = viewFrustum.getPosition() - center; float distanceToVoxelCenter = sqrtf(glm::dot(temp, temp)); return distanceToVoxelCenter; @@ -1339,14 +1334,12 @@ bool OctreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3 keepSearching = true; // assume that we will continue searching after this. - AACube cube = getAACube(); - cube.scale((float)TREE_SCALE); float distanceToElementCube = std::numeric_limits::max(); float distanceToElementDetails = distance; BoxFace localFace; // if the ray doesn't intersect with our cube, we can stop searching! - if (!cube.findRayIntersection(origin, direction, distanceToElementCube, localFace)) { + if (!_cube.findRayIntersection(origin, direction, distanceToElementCube, localFace)) { keepSearching = false; // no point in continuing to search return false; // we did not intersect } @@ -1358,7 +1351,7 @@ bool OctreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3 // if the distance to the element cube is not less than the current best distance, then it's not possible // for any details inside the cube to be closer so we don't need to consider them. - if (cube.contains(origin) || distanceToElementCube < distance) { + if (_cube.contains(origin) || distanceToElementCube < distance) { if (findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, face, intersectedObject, precisionPicking, distanceToElementCube)) { @@ -1393,9 +1386,7 @@ bool OctreeElement::findDetailedRayIntersection(const glm::vec3& origin, const g bool OctreeElement::findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const { // center and radius are in meters, so we have to scale the _cube into world-frame - AACube cube = _cube; - cube.scale((float)TREE_SCALE); - return cube.findSpherePenetration(center, radius, penetration); + return _cube.findSpherePenetration(center, radius, penetration); } // TODO: consider removing this, or switching to using getOrCreateChildElementContaining(const AACube& box)... @@ -1532,15 +1523,15 @@ int OctreeElement::getMyChildContaining(const AACube& cube) const { if (cubeScale > ourScale) { qDebug() << "UNEXPECTED -- OctreeElement::getMyChildContaining() -- (cubeScale > ourScale)"; qDebug() << " cube=" << cube; - qDebug() << " elements AACube=" << getAACube(); + qDebug() << " elements AACube=" << _cube; qDebug() << " cubeScale=" << cubeScale; qDebug() << " ourScale=" << ourScale; assert(false); } // Determine which of our children the minimum and maximum corners of the cube live in... - glm::vec3 cubeCornerMinimum = glm::clamp(cube.getCorner(), 0.0f, 1.0f); - glm::vec3 cubeCornerMaximum = glm::clamp(cube.calcTopFarLeft(), 0.0f, 1.0f); + glm::vec3 cubeCornerMinimum = glm::clamp(cube.getCorner(), 0.0f, (float)TREE_SCALE); + glm::vec3 cubeCornerMaximum = glm::clamp(cube.calcTopFarLeft(), 0.0f, (float)TREE_SCALE); if (_cube.contains(cubeCornerMinimum) && _cube.contains(cubeCornerMaximum)) { int childIndexCubeMinimum = getMyChildContainingPoint(cubeCornerMinimum); diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 8fe4fbd4d5..d47a324e07 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -101,7 +101,6 @@ void OctreeHeadlessViewer::queryOctree() { voxelDetailsForCode(rootCode, rootDetails); jurisdictions.unlock(); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverBounds.scale(TREE_SCALE); ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); @@ -170,7 +169,6 @@ void OctreeHeadlessViewer::queryOctree() { voxelDetailsForCode(rootCode, rootDetails); jurisdictions.unlock(); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverBounds.scale(TREE_SCALE); ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); if (serverFrustumLocation != ViewFrustum::OUTSIDE) { diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index c4ccd98036..187f916d35 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -22,13 +22,11 @@ OctreeRenderer::OctreeRenderer() : _managedTree(false), _viewFrustum(NULL) { - std::cout << "adebug " << (void*)(this) << " OctreeRenderer() _tree = " << (void*)(_tree) << std::endl; // adebug } void OctreeRenderer::init() { if (!_tree) { _tree = createTree(); - std::cout << "adebug " << (void*)(this) << " init _tree = " << (void*)(_tree) << std::endl; // adebug _managedTree = true; } } @@ -45,7 +43,6 @@ void OctreeRenderer::setTree(Octree* newTree) { _managedTree = false; } _tree = newTree; - std::cout << "adebug " << (void*)(this) << " setTree() _tree = " << (void*)(_tree) << std::endl; // adebug } void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 699b4cc386..c35ace6b11 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -84,19 +84,19 @@ void EntityMotionState::getWorldTransform(btTransform& worldTrans) const { // bypass const-ness so we can remember the substep const_cast(this)->_lastKinematicSubstep = substep; } - worldTrans.setOrigin(glmToBullet(_entity->getPositionInMeters() - ObjectMotionState::getWorldOffset())); + worldTrans.setOrigin(glmToBullet(_entity->getPosition() - ObjectMotionState::getWorldOffset())); worldTrans.setRotation(glmToBullet(_entity->getRotation())); } // This callback is invoked by the physics simulation at the end of each simulation frame... // iff the corresponding RigidBody is DYNAMIC and has moved. void EntityMotionState::setWorldTransform(const btTransform& worldTrans) { - _entity->setPositionInMeters(bulletToGLM(worldTrans.getOrigin()) + ObjectMotionState::getWorldOffset()); + _entity->setPosition(bulletToGLM(worldTrans.getOrigin()) + ObjectMotionState::getWorldOffset()); _entity->setRotation(bulletToGLM(worldTrans.getRotation())); glm::vec3 v; getVelocity(v); - _entity->setVelocityInMeters(v); + _entity->setVelocity(v); getAngularVelocity(v); // DANGER! EntityItem stores angularVelocity in degrees/sec!!! @@ -119,7 +119,7 @@ void EntityMotionState::setWorldTransform(const btTransform& worldTrans) { void EntityMotionState::updateObjectEasy(uint32_t flags, uint32_t frame) { if (flags & (EntityItem::DIRTY_POSITION | EntityItem::DIRTY_VELOCITY)) { if (flags & EntityItem::DIRTY_POSITION) { - _sentPosition = _entity->getPositionInMeters() - ObjectMotionState::getWorldOffset(); + _sentPosition = _entity->getPosition() - ObjectMotionState::getWorldOffset(); btTransform worldTrans; worldTrans.setOrigin(glmToBullet(_sentPosition)); @@ -156,14 +156,14 @@ void EntityMotionState::updateObjectEasy(uint32_t flags, uint32_t frame) { void EntityMotionState::updateObjectVelocities() { if (_body) { - _sentVelocity = _entity->getVelocityInMeters(); + _sentVelocity = _entity->getVelocity(); setVelocity(_sentVelocity); // DANGER! EntityItem stores angularVelocity in degrees/sec!!! _sentAngularVelocity = glm::radians(_entity->getAngularVelocity()); setAngularVelocity(_sentAngularVelocity); - _sentAcceleration = _entity->getGravityInMeters(); + _sentAcceleration = _entity->getGravity(); setGravity(_sentAcceleration); _body->setActivationState(ACTIVE_TAG); diff --git a/tests/octree/src/ModelTests.cpp b/tests/octree/src/ModelTests.cpp index e46fbc157a..e4309100af 100644 --- a/tests/octree/src/ModelTests.cpp +++ b/tests/octree/src/ModelTests.cpp @@ -66,17 +66,17 @@ void EntityTests::entityTreeTests(bool verbose) { const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenter, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); - AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); + const AACube& elementCube = containingElement ? containingElement->getAACube() : AACube(); if (verbose) { qDebug() << "foundEntityByRadius=" << foundEntityByRadius; qDebug() << "foundEntityByID=" << foundEntityByID; qDebug() << "containingElement=" << containingElement; qDebug() << "containingElement.box=" - << elementCube.getCorner().x * TREE_SCALE << "," - << elementCube.getCorner().y * TREE_SCALE << "," - << elementCube.getCorner().z * TREE_SCALE << ":" - << elementCube.getScale() * TREE_SCALE; + << elementCube.getCorner().x << "," + << elementCube.getCorner().y << "," + << elementCube.getCorner().z << ":" + << elementCube.getScale(); qDebug() << "elementCube.getScale()=" << elementCube.getScale(); //containingElement->printDebugDetails("containingElement"); } @@ -109,17 +109,17 @@ void EntityTests::entityTreeTests(bool verbose) { const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionNearOrigin, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); - AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); + const AACube& elementCube = containingElement ? containingElement->getAACube() : AACube(); if (verbose) { qDebug() << "foundEntityByRadius=" << foundEntityByRadius; qDebug() << "foundEntityByID=" << foundEntityByID; qDebug() << "containingElement=" << containingElement; qDebug() << "containingElement.box=" - << elementCube.getCorner().x * TREE_SCALE << "," - << elementCube.getCorner().y * TREE_SCALE << "," - << elementCube.getCorner().z * TREE_SCALE << ":" - << elementCube.getScale() * TREE_SCALE; + << elementCube.getCorner().x << "," + << elementCube.getCorner().y << "," + << elementCube.getCorner().z << ":" + << elementCube.getScale(); //containingElement->printDebugDetails("containingElement"); } @@ -149,17 +149,17 @@ void EntityTests::entityTreeTests(bool verbose) { const EntityItem* foundEntityByRadius = tree.findClosestEntity(positionAtCenter, targetRadius); const EntityItem* foundEntityByID = tree.findEntityByEntityItemID(entityID); EntityTreeElement* containingElement = tree.getContainingElement(entityID); - AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); + const AACube& elementCube = containingElement ? containingElement->getAACube() : AACube(); if (verbose) { qDebug() << "foundEntityByRadius=" << foundEntityByRadius; qDebug() << "foundEntityByID=" << foundEntityByID; qDebug() << "containingElement=" << containingElement; qDebug() << "containingElement.box=" - << elementCube.getCorner().x * TREE_SCALE << "," - << elementCube.getCorner().y * TREE_SCALE << "," - << elementCube.getCorner().z * TREE_SCALE << ":" - << elementCube.getScale() * TREE_SCALE; + << elementCube.getCorner().x << "," + << elementCube.getCorner().y << "," + << elementCube.getCorner().z << ":" + << elementCube.getScale(); //containingElement->printDebugDetails("containingElement"); } @@ -288,7 +288,7 @@ void EntityTests::entityTreeTests(bool verbose) { totalElapsedFind += (endFind - startFind); EntityTreeElement* containingElement = tree.getContainingElement(entityID); - AACube elementCube = containingElement ? containingElement->getAACube() : AACube(); + const AACube& elementCube = containingElement ? containingElement->getAACube() : AACube(); bool elementIsBestFit = containingElement->bestFitEntityBounds(foundEntityByID); @@ -297,10 +297,10 @@ void EntityTests::entityTreeTests(bool verbose) { qDebug() << "foundEntityByID=" << foundEntityByID; qDebug() << "containingElement=" << containingElement; qDebug() << "containingElement.box=" - << elementCube.getCorner().x * TREE_SCALE << "," - << elementCube.getCorner().y * TREE_SCALE << "," - << elementCube.getCorner().z * TREE_SCALE << ":" - << elementCube.getScale() * TREE_SCALE; + << elementCube.getCorner().x << "," + << elementCube.getCorner().y << "," + << elementCube.getCorner().z << ":" + << elementCube.getScale(); qDebug() << "elementCube.getScale()=" << elementCube.getScale(); //containingElement->printDebugDetails("containingElement"); qDebug() << "elementIsBestFit=" << elementIsBestFit; From c4dafc74ad2f4a1918c7e328d0590692d5ae8f42 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 15:33:15 -0800 Subject: [PATCH 22/28] whoops, remove last bestFitBoundsInMeters() call --- libraries/entities/src/AddEntityOperator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/AddEntityOperator.cpp b/libraries/entities/src/AddEntityOperator.cpp index 0844a10ede..09aa6af0cb 100644 --- a/libraries/entities/src/AddEntityOperator.cpp +++ b/libraries/entities/src/AddEntityOperator.cpp @@ -43,7 +43,7 @@ bool AddEntityOperator::preRecursion(OctreeElement* element) { if (!_foundNew && element->getAACube().contains(_newEntityBox)) { // If this element is the best fit for the new entity properties, then add/or update it - if (entityTreeElement->bestFitBoundsInMeters(_newEntityBox)) { + if (entityTreeElement->bestFitBounds(_newEntityBox)) { entityTreeElement->addEntityItem(_newEntity); _tree->setContainingElement(_newEntity->getEntityItemID(), entityTreeElement); From 95c7bcb5f8494d49f080b03f65ffea4e20814784 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 15:34:35 -0800 Subject: [PATCH 23/28] whoops -- remove last *InTreeUnits() calls --- libraries/entities/src/EntityTreeElement.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index fbd377cfeb..223a4eb478 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -416,11 +416,11 @@ bool EntityTreeElement::bestFitEntityBounds(const EntityItem* entity) const { } bool EntityTreeElement::containsBounds(const EntityItemProperties& properties) const { - return containsBounds(properties.getMaximumAACubeInTreeUnits()); + return containsBounds(properties.getMaximumAACube()); } bool EntityTreeElement::bestFitBounds(const EntityItemProperties& properties) const { - return bestFitBounds(properties.getMaximumAACubeInTreeUnits()); + return bestFitBounds(properties.getMaximumAACube()); } bool EntityTreeElement::containsBounds(const AACube& bounds) const { From f5352333f06167f238cd6a68c7095bb45aa50518 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 6 Mar 2015 16:42:06 -0800 Subject: [PATCH 24/28] entities use radians per second for angular velocity --- .../src/octree/OctreePacketProcessor.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 25 +++++++++---------- libraries/entities/src/EntityItem.h | 1 + libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/networking/src/PacketHeaders.h | 2 +- libraries/physics/src/EntityMotionState.cpp | 9 +++---- 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index f87e978b66..92eb7f7f31 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -61,7 +61,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, // check version of piggyback packet against expected version if (packetVersion != expectedVersion // TODO: remove the temporary exception below when everyone is using meters instead of DomainUnits - && !(PacketTypeEntityData == voxelPacketType && packetVersion < VERSION_ENTITIES_USE_METERS)) { + && !(PacketTypeEntityData == voxelPacketType && packetVersion < VERSION_ENTITIES_USE_METERS_AND_RADIANS)) { static QMultiMap versionDebugSuppressMap; QUuid senderUUID = uuidFromPacketHeader(packet); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 5a1712a1f6..093f8cf84c 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -501,7 +501,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef EntityPropertyFlags propertyFlags = encodedPropertyFlags; dataAt += propertyFlags.getEncodedLength(); bytesRead += propertyFlags.getEncodedLength(); - bool useMeters = (args.bitstreamVersion == VERSION_ENTITIES_USE_METERS); + bool useMeters = (args.bitstreamVersion == VERSION_ENTITIES_USE_METERS_AND_RADIANS); if (useMeters) { READ_ENTITY_PROPERTY_SETTER(PROP_POSITION, glm::vec3, updatePosition); } else { @@ -540,7 +540,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY_SETTER(PROP_LIFETIME, float, updateLifetime); READ_ENTITY_PROPERTY_STRING(PROP_SCRIPT, setScript); READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, _registrationPoint); - READ_ENTITY_PROPERTY_SETTER(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocity); + if (useMeters) { + READ_ENTITY_PROPERTY_SETTER(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocity); + } else { + READ_ENTITY_PROPERTY_SETTER(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocityInDegrees); + } READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, _angularDamping); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, _visible); READ_ENTITY_PROPERTY_SETTER(PROP_IGNORE_FOR_COLLISIONS, bool, updateIgnoreForCollisions); @@ -683,41 +687,36 @@ void EntityItem::simulate(const quint64& now) { void EntityItem::simulateKinematicMotion(float timeElapsed) { if (hasAngularVelocity()) { // angular damping - glm::vec3 angularVelocity = getAngularVelocity(); if (_angularDamping > 0.0f) { - angularVelocity *= powf(1.0f - _angularDamping, timeElapsed); + _angularVelocity *= powf(1.0f - _angularDamping, timeElapsed); #ifdef WANT_DEBUG qDebug() << " angularDamping :" << _angularDamping; - qDebug() << " newAngularVelocity:" << angularVelocity; + qDebug() << " newAngularVelocity:" << _angularVelocity; #endif - setAngularVelocity(angularVelocity); } float angularSpeed = glm::length(_angularVelocity); - const float EPSILON_ANGULAR_VELOCITY_LENGTH = 0.1f; // + const float EPSILON_ANGULAR_VELOCITY_LENGTH = 0.0017453f; // 0.0017453 rad/sec = 0.1f degrees/sec if (angularSpeed < EPSILON_ANGULAR_VELOCITY_LENGTH) { if (angularSpeed > 0.0f) { _dirtyFlags |= EntityItem::DIRTY_MOTION_TYPE; } - setAngularVelocity(ENTITY_ITEM_ZERO_VEC3); + _angularVelocity = ENTITY_ITEM_ZERO_VEC3; } else { - // NOTE: angularSpeed is currently in degrees/sec!!! - // TODO: Andrew to convert to radians/sec - glm::vec3 angularVelocity = glm::radians(_angularVelocity); // for improved agreement with the way Bullet integrates rotations we use an approximation // and break the integration into bullet-sized substeps glm::quat rotation = getRotation(); float dt = timeElapsed; while (dt > PHYSICS_ENGINE_FIXED_SUBSTEP) { - glm::quat dQ = computeBulletRotationStep(angularVelocity, PHYSICS_ENGINE_FIXED_SUBSTEP); + glm::quat dQ = computeBulletRotationStep(_angularVelocity, PHYSICS_ENGINE_FIXED_SUBSTEP); rotation = glm::normalize(dQ * rotation); dt -= PHYSICS_ENGINE_FIXED_SUBSTEP; } // NOTE: this final partial substep can drift away from a real Bullet simulation however // it only becomes significant for rapidly rotating objects // (e.g. around PI/4 radians per substep, or 7.5 rotations/sec at 60 substeps/sec). - glm::quat dQ = computeBulletRotationStep(angularVelocity, dt); + glm::quat dQ = computeBulletRotationStep(_angularVelocity, dt); rotation = glm::normalize(dQ * rotation); setRotation(rotation); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 0f8139eea5..5193aa4490 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -275,6 +275,7 @@ public: void updateGravityInDomainUnits(const glm::vec3& value); void updateGravity(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); + void updateAngularVelocityInDegrees(const glm::vec3& value) { updateAngularVelocity(glm::radians(value)); } void updateAngularDamping(float value); void updateIgnoreForCollisions(bool value); void updateCollisionsWillMove(bool value); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 6150ba5a9e..c7f1f4ec88 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -74,7 +74,7 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: - return VERSION_ENTITIES_USE_METERS; + return VERSION_ENTITIES_USE_METERS_AND_RADIANS; case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index dd0e166ea8..731be118af 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -129,7 +129,7 @@ const PacketVersion VERSION_ENTITIES_HAVE_USER_DATA = 6; const PacketVersion VERSION_ENTITIES_HAS_LAST_SIMULATED_TIME = 7; const PacketVersion VERSION_MODEL_ENTITIES_SUPPORT_SHAPE_TYPE = 8; const PacketVersion VERSION_ENTITIES_LIGHT_HAS_INTENSITY_AND_COLOR_PROPERTIES = 9; -const PacketVersion VERSION_ENTITIES_USE_METERS = 10; +const PacketVersion VERSION_ENTITIES_USE_METERS_AND_RADIANS = 10; const PacketVersion VERSION_OCTREE_HAS_FILE_BREAKS = 1; #endif // hifi_PacketHeaders_h diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index c35ace6b11..cd0769255b 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -99,8 +99,7 @@ void EntityMotionState::setWorldTransform(const btTransform& worldTrans) { _entity->setVelocity(v); getAngularVelocity(v); - // DANGER! EntityItem stores angularVelocity in degrees/sec!!! - _entity->setAngularVelocity(glm::degrees(v)); + _entity->setAngularVelocity(v); _entity->setLastSimulated(usecTimestampNow()); @@ -159,8 +158,7 @@ void EntityMotionState::updateObjectVelocities() { _sentVelocity = _entity->getVelocity(); setVelocity(_sentVelocity); - // DANGER! EntityItem stores angularVelocity in degrees/sec!!! - _sentAngularVelocity = glm::radians(_entity->getAngularVelocity()); + _sentAngularVelocity = _entity->getAngularVelocity(); setAngularVelocity(_sentAngularVelocity); _sentAcceleration = _entity->getGravity(); @@ -219,8 +217,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_ properties.setVelocity(_sentVelocity); _sentAcceleration = bulletToGLM(_body->getGravity()); properties.setGravity(_sentAcceleration); - // DANGER! EntityItem stores angularVelocity in degrees/sec!!! - properties.setAngularVelocity(glm::degrees(_sentAngularVelocity)); + properties.setAngularVelocity(_sentAngularVelocity); } // RELIABLE_SEND_HACK: count number of updates for entities at rest so we can stop sending them after some limit. From 5b854857c19d54488d5dc01f372c6729fee67660 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Sat, 7 Mar 2015 18:02:41 -0800 Subject: [PATCH 25/28] fix JS scripts to use radians per second in entity properties --- examples/controllers/hydra/toyball.js | 2 -- examples/dice.js | 6 ++-- examples/example/entities/spotlightExample.js | 4 ++- examples/html/entityProperties.html | 30 +++++++++++++++---- examples/libraries/entityPropertyDialogBox.js | 17 +++++++---- examples/planets.js | 6 ++-- examples/popcorn.js | 7 +++-- examples/walk.js | 2 +- 8 files changed, 53 insertions(+), 21 deletions(-) diff --git a/examples/controllers/hydra/toyball.js b/examples/controllers/hydra/toyball.js index 5306769e95..89085fad19 100644 --- a/examples/controllers/hydra/toyball.js +++ b/examples/controllers/hydra/toyball.js @@ -92,7 +92,6 @@ function checkControllerSide(whichSide) { Vec3.multiply(1.0 - AVERAGE_FACTOR, averageLinearVelocity[0])); linearVelocity = averageLinearVelocity[0]; angularVelocity = Vec3.multiplyQbyV(MyAvatar.orientation, Controller.getSpatialControlRawAngularVelocity(LEFT_TIP)); - angularVelocity = Vec3.multiply(180.0 / Math.PI, angularVelocity); } else { BUTTON_FWD = RIGHT_BUTTON_FWD; BUTTON_3 = RIGHT_BUTTON_3; @@ -104,7 +103,6 @@ function checkControllerSide(whichSide) { Vec3.multiply(1.0 - AVERAGE_FACTOR, averageLinearVelocity[1])); linearVelocity = averageLinearVelocity[1]; angularVelocity = Vec3.multiplyQbyV(MyAvatar.orientation, Controller.getSpatialControlRawAngularVelocity(RIGHT_TIP)); - angularVelocity = Vec3.multiply(180.0 / Math.PI, angularVelocity); handMessage = "RIGHT"; } diff --git a/examples/dice.js b/examples/dice.js index 1205f38ee1..b0021ecebb 100644 --- a/examples/dice.js +++ b/examples/dice.js @@ -53,7 +53,9 @@ function shootDice(position, velocity) { position: position, velocity: velocity, rotation: Quat.fromPitchYawRollDegrees(Math.random() * 360, Math.random() * 360, Math.random() * 360), - angularVelocity: { x: Math.random() * 100, y: Math.random() * 100, z: Math.random() * 100 }, + // NOTE: angularVelocity is in radians/sec + var maxAngularSpeed = Math.PI; + angularVelocity: { x: Math.random() * maxAngularSpeed, y: Math.random() * maxAngularSpeed, z: Math.random() * maxAngularSpeed }, lifetime: LIFETIME, gravity: { x: 0, y: GRAVITY, z: 0 }, shapeType: "box", @@ -108,4 +110,4 @@ function scriptEnding() { Entities.entityCollisionWithEntity.connect(entityCollisionWithEntity); Controller.mousePressEvent.connect(mousePressEvent); -Script.scriptEnding.connect(scriptEnding); \ No newline at end of file +Script.scriptEnding.connect(scriptEnding); diff --git a/examples/example/entities/spotlightExample.js b/examples/example/entities/spotlightExample.js index 5eb5432f3f..80c89926a3 100644 --- a/examples/example/entities/spotlightExample.js +++ b/examples/example/entities/spotlightExample.js @@ -11,11 +11,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +var DEGREES_TO_RADIANS = Math.PI / 180.0; + var lightProperties = { type: "Light", position: { x: 0, y: 0, z: 0 }, dimensions: { x: 1000, y: 1000, z: 1000 }, - angularVelocity: { x: 0, y: 10, z: 0 }, + angularVelocity: { x: 0, y: 10 * DEGREES_TO_RADIANS, z: 0 }, angularDamping: 0, isSpotlight: true, diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index fd1a4e3821..cb49b86975 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -2,6 +2,10 @@