Example #1
0
bool AddEntityOperator::preRecursion(const OctreeElementPointer& element) {
    EntityTreeElementPointer entityTreeElement = std::static_pointer_cast<EntityTreeElement>(element);

    // In Pre-recursion, we're generally deciding whether or not we want to recurse this
    // path of the tree. For this operation, we want to recurse the branch of the tree if
    // any of the following are true:
    //   * We have not yet found the location for the new entity, and this branch contains the bounds of the new entity
    
    bool keepSearching = false; // assume we don't need to search any more
    
    // If we haven't yet found the new entity,  and this subTreeContains our new
    // entity, then we need to keep searching.
    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)) {
            _tree->addEntityMapEntry(_newEntity);
            entityTreeElement->addEntityItem(_newEntity);
            _foundNew = true;
            keepSearching = false;
        } else {
            keepSearching = true;
        }
    }
    
    return keepSearching; // if we haven't yet found it, keep looking
}
bool UpdateEntityOperator::preRecursion(OctreeElementPointer element) {
    EntityTreeElementPointer entityTreeElement = std::static_pointer_cast<EntityTreeElement>(element);
    
    // In Pre-recursion, we're generally deciding whether or not we want to recurse this
    // path of the tree. For this operation, we want to recurse the branch of the tree if
    // and of the following are true:
    //   * We have not yet found the old entity, and this branch contains our old entity
    //   * We have not yet found the new entity, and this branch contains our new entity
    //
    // Note: it's often the case that the branch in question contains both the old entity
    // and the new entity.
    
    bool keepSearching = false; // assume we don't need to search any more

    bool subtreeContainsOld = subTreeContainsOldEntity(element);
    bool subtreeContainsNew = subTreeContainsNewEntity(element);

    if (_wantDebug) {
        qCDebug(entities) << "---- UpdateEntityOperator::preRecursion().... ----";
        qCDebug(entities) << "    element=" << element->getAACube();
        qCDebug(entities) << "    subtreeContainsOld=" << subtreeContainsOld;
        qCDebug(entities) << "    subtreeContainsNew=" << subtreeContainsNew;
        qCDebug(entities) << "    _foundOld=" << _foundOld;
        qCDebug(entities) << "    _foundNew=" << _foundNew;
    }

    // If we haven't yet found the old entity, and this subTreeContains our old
    // entity, then we need to keep searching.
    if (!_foundOld && subtreeContainsOld) {

        if (_wantDebug) {
            qCDebug(entities) << "    OLD TREE CASE....";
            qCDebug(entities) << "    entityTreeElement=" << entityTreeElement.get();
            qCDebug(entities) << "    _containingElement=" << _containingElement.get();
        }

        // If this is the element we're looking for, then ask it to remove the old entity
        // and we can stop searching.
        if (entityTreeElement == _containingElement) {

            if (_wantDebug) {
                qCDebug(entities) << "    *** it's the OLD ELEMENT! ***";
            }

            // If the containgElement IS NOT the best fit for the new entity properties
            // then we need to remove it, and the updateEntity below will store it in the
            // correct element.
            if (_removeOld) {

                if (_wantDebug) {
                    qCDebug(entities) << "    *** REMOVING from ELEMENT ***";
                }

                // the entity knows what element it's in, so we remove it from that one
                // NOTE: we know we haven't yet added it to its new element because _removeOld is true
                EntityTreeElementPointer oldElement = _existingEntity->getElement();
                oldElement->removeEntityItem(_existingEntity);
                _tree->setContainingElement(_entityItemID, NULL);

                if (oldElement != _containingElement) {
                    qCDebug(entities) << "WARNING entity moved during UpdateEntityOperator recursion";
                    _containingElement->removeEntityItem(_existingEntity);
                }

                if (_wantDebug) {
                    qCDebug(entities) << "    *** REMOVING from MAP ***";
                }
            }
            _foundOld = true;
        } else {
            // if this isn't the element we're looking for, then keep searching
            keepSearching = true;
        }
    }

    // If we haven't yet found the new entity,  and this subTreeContains our new
    // entity, then we need to keep searching.
    if (!_foundNew && subtreeContainsNew) {

        if (_wantDebug) {
            qCDebug(entities) << "    NEW TREE CASE....";
            qCDebug(entities) << "    entityTreeElement=" << entityTreeElement.get();
            qCDebug(entities) << "    _containingElement=" << _containingElement.get();
            qCDebug(entities) << "    entityTreeElement->bestFitBounds(_newEntityBox)=" << entityTreeElement->bestFitBounds(_newEntityBox);
        }

        // If this element is the best fit for the new entity properties, then add/or update it
        if (entityTreeElement->bestFitBounds(_newEntityBox)) {

            if (_wantDebug) {
                qCDebug(entities) << "    *** THIS ELEMENT IS BEST FIT ***";
            }

            EntityTreeElementPointer oldElement = _existingEntity->getElement();
            // if we are the existing containing element, then we can just do the update of the entity properties
            if (entityTreeElement == oldElement) {

                if (_wantDebug) {
                    qCDebug(entities) << "    *** This is the same OLD ELEMENT ***";
                }
            
                // set the entity properties and mark our element as changed.
                _existingEntity->setProperties(_properties);
                if (_wantDebug) {
                    qCDebug(entities) << "    *** set properties ***";
                }
            } else {
                // otherwise, this is an add case.
                if (oldElement) {
                    oldElement->removeEntityItem(_existingEntity);
                    if (oldElement != _containingElement) {
                        qCDebug(entities) << "WARNING entity moved during UpdateEntityOperator recursion";
                    }
                }
                entityTreeElement->addEntityItem(_existingEntity);
                _tree->setContainingElement(_entityItemID, entityTreeElement);

                _existingEntity->setProperties(_properties); // still need to update the properties!
                if (_wantDebug) {
                    qCDebug(entities) << "    *** ADDING ENTITY to ELEMENT and MAP and SETTING PROPERTIES ***";
                }
            }
            _foundNew = true; // we found the new element
            _removeOld = false; // and it has already been removed from the old
        } else {
            keepSearching = true;
        }
    }

    if (_wantDebug) {
        qCDebug(entities) << "    FINAL --- keepSearching=" << keepSearching;
        qCDebug(entities) << "--------------------------------------------------";
    }

    
    return keepSearching; // if we haven't yet found it, keep looking
}
bool MovingEntitiesOperator::preRecursion(const OctreeElementPointer& element) {
    EntityTreeElementPointer entityTreeElement = std::static_pointer_cast<EntityTreeElement>(element);
    
    // In Pre-recursion, we're generally deciding whether or not we want to recurse this
    // path of the tree. For this operation, we want to recurse the branch of the tree if
    // any of the following are true:
    //   * We have not yet found the old entity, and this branch contains our old entity
    //   * We have not yet found the new entity, and this branch contains our new entity
    //
    // Note: it's often the case that the branch in question contains both the old entity
    // and the new entity.
    
    bool keepSearching = (_foundOldCount < _lookingCount) || (_foundNewCount < _lookingCount);

    // If we haven't yet found all the entities, and this sub tree contains at least one of our
    // entities, then we need to keep searching.
    if (keepSearching && shouldRecurseSubTree(element)) {

        // check against each of our search entities
        int detailIndex = 0;
        foreach(const EntityToMoveDetails& details, _entitiesToMove) {
        
            if (_wantDebug) {
                qCDebug(entities) << "MovingEntitiesOperator::preRecursion() details["<< detailIndex <<"]-----------------------------";
                qCDebug(entities) << "    entityTreeElement:" << entityTreeElement->getAACube();
                qCDebug(entities) << "    entityTreeElement->bestFitBounds(details.newCube):" << entityTreeElement->bestFitBounds(details.newCube);
                qCDebug(entities) << "    details.entity:" << details.entity->getEntityItemID();
                qCDebug(entities) << "    details.oldContainingElementCube:" << details.oldContainingElementCube;
                qCDebug(entities) << "    entityTreeElement:" << entityTreeElement.get();
                qCDebug(entities) << "    details.newCube:" << details.newCube;
                qCDebug(entities) << "    details.newCubeClamped:" << details.newCubeClamped;
                qCDebug(entities) << "    _lookingCount:" << _lookingCount;
                qCDebug(entities) << "    _foundOldCount:" << _foundOldCount;
                qCDebug(entities) << "--------------------------------------------------------------------------";
            }
        

            // If this is one of the old elements we're looking for, then ask it to remove the old entity
            if (!details.oldFound && entityTreeElement == details.oldContainingElement) {
                // DO NOT remove the entity here.  It will be removed when added to the destination element.
                _foundOldCount++;
                //details.oldFound = true; // TODO: would be nice to add this optimization
                if (_wantDebug) {
                    qCDebug(entities) << "MovingEntitiesOperator::preRecursion() -----------------------------";
                    qCDebug(entities) << "    FOUND OLD - REMOVING";
                    qCDebug(entities) << "    entityTreeElement == details.oldContainingElement";
                    qCDebug(entities) << "--------------------------------------------------------------------------";
                }
            }

            // If this element is the best fit for the new bounds of this entity then add the entity to the element
            if (!details.newFound && entityTreeElement->bestFitBounds(details.newCube)) {
                // remove from the old before adding
                EntityTreeElementPointer oldElement = details.entity->getElement();
                if (oldElement != entityTreeElement) {
                    if (oldElement) {
                        oldElement->removeEntityItem(details.entity);
                    }
                    entityTreeElement->addEntityItem(details.entity);
                } else {
                    entityTreeElement->bumpChangedContent();
                }
                _foundNewCount++;
                //details.newFound = true; // TODO: would be nice to add this optimization
                if (_wantDebug) {
                    qCDebug(entities) << "MovingEntitiesOperator::preRecursion() -----------------------------";
                    qCDebug(entities) << "    FOUND NEW - ADDING";
                    qCDebug(entities) << "    entityTreeElement->bestFitBounds(details.newCube)";
                    qCDebug(entities) << "--------------------------------------------------------------------------";
                }
            }
            detailIndex++;
        }
        // if we haven't found all of our search for entities, then keep looking
        keepSearching = (_foundOldCount < _lookingCount) || (_foundNewCount < _lookingCount);
    }