mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-23 19:04:29 +02:00
clean-up concept of puffed queryAACube
This commit is contained in:
parent
cf960dc44b
commit
f2cb5d4aff
10 changed files with 50 additions and 65 deletions
|
@ -587,7 +587,7 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
MovingEntitiesOperator moveOperator;
|
MovingEntitiesOperator moveOperator;
|
||||||
forEachDescendant([&](SpatiallyNestablePointer object) {
|
forEachDescendant([&](SpatiallyNestablePointer object) {
|
||||||
// if the queryBox has changed, tell the entity-server
|
// if the queryBox has changed, tell the entity-server
|
||||||
if (object->getNestableType() == NestableType::Entity && object->checkAndMaybeUpdateQueryAACube()) {
|
if (object->getNestableType() == NestableType::Entity && object->updateQueryAACube()) {
|
||||||
EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object);
|
EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object);
|
||||||
bool success;
|
bool success;
|
||||||
AACube newCube = entity->getQueryAACube(success);
|
AACube newCube = entity->getQueryAACube(success);
|
||||||
|
|
|
@ -69,7 +69,7 @@ ParticleEffectEntityRenderer::ParticleEffectEntityRenderer(const EntityItemPoint
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParticleEffectEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
bool ParticleEffectEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
||||||
entity->checkAndMaybeUpdateQueryAACube();
|
entity->updateQueryAACube();
|
||||||
|
|
||||||
if (_emitting != entity->getIsEmitting()) {
|
if (_emitting != entity->getIsEmitting()) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1392,8 +1392,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) {
|
||||||
|
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy);
|
||||||
|
|
||||||
AACube saveQueryAACube = _queryAACube;
|
if (updateQueryAACube()) {
|
||||||
if (checkAndMaybeUpdateQueryAACube() && saveQueryAACube != _queryAACube) {
|
|
||||||
somethingChanged = true;
|
somethingChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1557,6 +1556,9 @@ AACube EntityItem::getQueryAACube(bool& success) const {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EntityItem::shouldPuffQueryAACube() const {
|
||||||
|
return hasActions() || isChildOfMyAvatar();
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: This should only be used in cases of old bitstreams which only contain radius data
|
// NOTE: This should only be used in cases of old bitstreams which only contain radius data
|
||||||
// 0,0,0 --> maxDimension,maxDimension,maxDimension
|
// 0,0,0 --> maxDimension,maxDimension,maxDimension
|
||||||
|
|
|
@ -240,6 +240,7 @@ public:
|
||||||
|
|
||||||
using SpatiallyNestable::getQueryAACube;
|
using SpatiallyNestable::getQueryAACube;
|
||||||
virtual AACube getQueryAACube(bool& success) const override;
|
virtual AACube getQueryAACube(bool& success) const override;
|
||||||
|
virtual bool shouldPuffQueryAACube() const override;
|
||||||
|
|
||||||
QString getScript() const;
|
QString getScript() const;
|
||||||
void setScript(const QString& value);
|
void setScript(const QString& value);
|
||||||
|
|
|
@ -457,7 +457,7 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties&
|
||||||
// if they've changed.
|
// if they've changed.
|
||||||
entity->forEachDescendant([&](SpatiallyNestablePointer descendant) {
|
entity->forEachDescendant([&](SpatiallyNestablePointer descendant) {
|
||||||
if (descendant->getNestableType() == NestableType::Entity) {
|
if (descendant->getNestableType() == NestableType::Entity) {
|
||||||
if (descendant->checkAndMaybeUpdateQueryAACube()) {
|
if (descendant->updateQueryAACube()) {
|
||||||
EntityItemPointer entityDescendant = std::static_pointer_cast<EntityItem>(descendant);
|
EntityItemPointer entityDescendant = std::static_pointer_cast<EntityItem>(descendant);
|
||||||
EntityItemProperties newQueryCubeProperties;
|
EntityItemProperties newQueryCubeProperties;
|
||||||
newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube());
|
newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube());
|
||||||
|
|
|
@ -1804,7 +1804,7 @@ QVector<EntityItemID> EntityTree::sendEntities(EntityEditPacketSender* packetSen
|
||||||
addToNeedsParentFixupList(entity);
|
addToNeedsParentFixupList(entity);
|
||||||
}
|
}
|
||||||
entity->forceQueryAACubeUpdate();
|
entity->forceQueryAACubeUpdate();
|
||||||
entity->checkAndMaybeUpdateQueryAACube();
|
entity->updateQueryAACube();
|
||||||
moveOperator.addEntityToMoveList(entity, entity->getQueryAACube());
|
moveOperator.addEntityToMoveList(entity, entity->getQueryAACube());
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -136,7 +136,7 @@ void SimpleEntitySimulation::sortEntitiesThatMoved() {
|
||||||
SetOfEntities::iterator itemItr = _entitiesToSort.begin();
|
SetOfEntities::iterator itemItr = _entitiesToSort.begin();
|
||||||
while (itemItr != _entitiesToSort.end()) {
|
while (itemItr != _entitiesToSort.end()) {
|
||||||
EntityItemPointer entity = *itemItr;
|
EntityItemPointer entity = *itemItr;
|
||||||
entity->checkAndMaybeUpdateQueryAACube();
|
entity->updateQueryAACube();
|
||||||
++itemItr;
|
++itemItr;
|
||||||
}
|
}
|
||||||
EntitySimulation::sortEntitiesThatMoved();
|
EntitySimulation::sortEntitiesThatMoved();
|
||||||
|
|
|
@ -581,7 +581,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (properties.transformChanged()) {
|
if (properties.transformChanged()) {
|
||||||
if (_entity->checkAndMaybeUpdateQueryAACube(true)) {
|
if (_entity->updateQueryAACube()) {
|
||||||
// due to parenting, the server may not know where something is in world-space, so include the bounding cube.
|
// due to parenting, the server may not know where something is in world-space, so include the bounding cube.
|
||||||
properties.setQueryAACube(_entity->getQueryAACube());
|
properties.setQueryAACube(_entity->getQueryAACube());
|
||||||
}
|
}
|
||||||
|
@ -648,7 +648,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
|
||||||
_entity->forEachDescendant([&](SpatiallyNestablePointer descendant) {
|
_entity->forEachDescendant([&](SpatiallyNestablePointer descendant) {
|
||||||
if (descendant->getNestableType() == NestableType::Entity) {
|
if (descendant->getNestableType() == NestableType::Entity) {
|
||||||
EntityItemPointer entityDescendant = std::static_pointer_cast<EntityItem>(descendant);
|
EntityItemPointer entityDescendant = std::static_pointer_cast<EntityItem>(descendant);
|
||||||
if (descendant->checkAndMaybeUpdateQueryAACube()) {
|
if (descendant->updateQueryAACube()) {
|
||||||
EntityItemProperties newQueryCubeProperties;
|
EntityItemProperties newQueryCubeProperties;
|
||||||
newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube());
|
newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube());
|
||||||
newQueryCubeProperties.setLastEdited(properties.getLastEdited());
|
newQueryCubeProperties.setLastEdited(properties.getLastEdited());
|
||||||
|
|
|
@ -963,37 +963,39 @@ AACube SpatiallyNestable::getMaximumAACube(bool& success) const {
|
||||||
|
|
||||||
const float PARENTED_EXPANSION_FACTOR = 3.0f;
|
const float PARENTED_EXPANSION_FACTOR = 3.0f;
|
||||||
|
|
||||||
bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube(bool forcePuffed) {
|
bool SpatiallyNestable::updateQueryAACube() {
|
||||||
bool updated = false;
|
if (!queryAACubeNeedsUpdate()) {
|
||||||
bool success = false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success;
|
||||||
AACube maxAACube = getMaximumAACube(success);
|
AACube maxAACube = getMaximumAACube(success);
|
||||||
if (success) {
|
if (success) {
|
||||||
// maybe update _queryAACube
|
if (shouldPuffQueryAACube()) {
|
||||||
if (!_queryAACubeSet || !_queryAACube.contains(maxAACube)) {
|
// make an expanded AACube centered on the object
|
||||||
if (forcePuffed || _parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) {
|
float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale();
|
||||||
// make an expanded AACube centered on the object
|
_queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale);
|
||||||
float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale();
|
_queryAACubeIsPuffed = true;
|
||||||
_queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale);
|
} else {
|
||||||
} else {
|
_queryAACube = maxAACube;
|
||||||
_queryAACube = maxAACube;
|
_queryAACubeIsPuffed = false;
|
||||||
}
|
|
||||||
updated = true;
|
|
||||||
|
|
||||||
forEachDescendant([&](const SpatiallyNestablePointer& descendant) {
|
|
||||||
bool childSuccess;
|
|
||||||
AACube descendantAACube = descendant->getQueryAACube(childSuccess);
|
|
||||||
if (childSuccess) {
|
|
||||||
if (_queryAACube.contains(descendantAACube)) {
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
_queryAACube += descendantAACube.getMinimumPoint();
|
|
||||||
_queryAACube += descendantAACube.getMaximumPoint();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
_queryAACubeSet = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forEachDescendant([&](const SpatiallyNestablePointer& descendant) {
|
||||||
|
bool childSuccess;
|
||||||
|
AACube descendantAACube = descendant->getQueryAACube(childSuccess);
|
||||||
|
if (childSuccess) {
|
||||||
|
if (_queryAACube.contains(descendantAACube)) {
|
||||||
|
return; // from lambda
|
||||||
|
}
|
||||||
|
_queryAACube += descendantAACube.getMinimumPoint();
|
||||||
|
_queryAACube += descendantAACube.getMaximumPoint();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_queryAACubeSet = true;
|
||||||
}
|
}
|
||||||
return updated;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpatiallyNestable::setQueryAACube(const AACube& queryAACube) {
|
void SpatiallyNestable::setQueryAACube(const AACube& queryAACube) {
|
||||||
|
@ -1016,6 +1018,10 @@ bool SpatiallyNestable::queryAACubeNeedsUpdate() const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shouldPuffQueryAACube() != _queryAACubeIsPuffed) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// make sure children are still in their boxes, also.
|
// make sure children are still in their boxes, also.
|
||||||
bool childNeedsUpdate = false;
|
bool childNeedsUpdate = false;
|
||||||
forEachDescendantTest([&](const SpatiallyNestablePointer& descendant) {
|
forEachDescendantTest([&](const SpatiallyNestablePointer& descendant) {
|
||||||
|
@ -1029,31 +1035,6 @@ bool SpatiallyNestable::queryAACubeNeedsUpdate() const {
|
||||||
return childNeedsUpdate;
|
return childNeedsUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpatiallyNestable::updateQueryAACube() {
|
|
||||||
bool success;
|
|
||||||
AACube maxAACube = getMaximumAACube(success);
|
|
||||||
if (_parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) {
|
|
||||||
// make an expanded AACube centered on the object
|
|
||||||
float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale();
|
|
||||||
_queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale);
|
|
||||||
} else {
|
|
||||||
_queryAACube = maxAACube;
|
|
||||||
}
|
|
||||||
|
|
||||||
forEachDescendant([&](const SpatiallyNestablePointer& descendant) {
|
|
||||||
bool success;
|
|
||||||
AACube descendantAACube = descendant->getQueryAACube(success);
|
|
||||||
if (success) {
|
|
||||||
if (_queryAACube.contains(descendantAACube)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_queryAACube += descendantAACube.getMinimumPoint();
|
|
||||||
_queryAACube += descendantAACube.getMaximumPoint();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
_queryAACubeSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
AACube SpatiallyNestable::getQueryAACube(bool& success) const {
|
AACube SpatiallyNestable::getQueryAACube(bool& success) const {
|
||||||
if (_queryAACubeSet) {
|
if (_queryAACubeSet) {
|
||||||
success = true;
|
success = true;
|
||||||
|
|
|
@ -106,11 +106,11 @@ public:
|
||||||
virtual glm::vec3 getParentAngularVelocity(bool& success) const;
|
virtual glm::vec3 getParentAngularVelocity(bool& success) const;
|
||||||
|
|
||||||
virtual AACube getMaximumAACube(bool& success) const;
|
virtual AACube getMaximumAACube(bool& success) const;
|
||||||
bool checkAndMaybeUpdateQueryAACube(bool forcePuffed = false);
|
|
||||||
void updateQueryAACube();
|
|
||||||
|
|
||||||
virtual void setQueryAACube(const AACube& queryAACube);
|
virtual void setQueryAACube(const AACube& queryAACube);
|
||||||
virtual bool queryAACubeNeedsUpdate() const;
|
virtual bool queryAACubeNeedsUpdate() const;
|
||||||
|
virtual bool shouldPuffQueryAACube() const { return false; }
|
||||||
|
bool updateQueryAACube();
|
||||||
void forceQueryAACubeUpdate() { _queryAACubeSet = false; }
|
void forceQueryAACubeUpdate() { _queryAACubeSet = false; }
|
||||||
virtual AACube getQueryAACube(bool& success) const;
|
virtual AACube getQueryAACube(bool& success) const;
|
||||||
virtual AACube getQueryAACube() const;
|
virtual AACube getQueryAACube() const;
|
||||||
|
@ -234,6 +234,7 @@ private:
|
||||||
glm::vec3 _angularVelocity;
|
glm::vec3 _angularVelocity;
|
||||||
mutable bool _parentKnowsMe { false };
|
mutable bool _parentKnowsMe { false };
|
||||||
bool _isDead { false };
|
bool _isDead { false };
|
||||||
|
bool _queryAACubeIsPuffed { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue