Merge pull request #11554 from sethalves/import-av-entities

Import av entities
This commit is contained in:
Brad Hefta-Gaub 2017-10-12 13:30:53 -07:00 committed by GitHub
commit 1bba5ff812
9 changed files with 69 additions and 18 deletions

View file

@ -3963,9 +3963,14 @@ void Application::calibrateEyeTracker5Points() {
}
#endif
bool Application::exportEntities(const QString& filename, const QVector<EntityItemID>& entityIDs, const glm::vec3* givenOffset) {
bool Application::exportEntities(const QString& filename,
const QVector<EntityItemID>& entityIDs,
const glm::vec3* givenOffset) {
QHash<EntityItemID, EntityItemPointer> entities;
auto nodeList = DependencyManager::get<NodeList>();
const QUuid myAvatarID = nodeList->getSessionUUID();
auto entityTree = getEntities()->getTree();
auto exportTree = std::make_shared<EntityTree>();
exportTree->createRootElement();
@ -3981,8 +3986,12 @@ bool Application::exportEntities(const QString& filename, const QVector<EntityIt
if (!givenOffset) {
EntityItemID parentID = entityItem->getParentID();
if (parentID.isInvalidID() || !entityIDs.contains(parentID) || !entityTree->findEntityByEntityItemID(parentID)) {
auto position = entityItem->getPosition(); // If parent wasn't selected, we want absolute position, which isn't in properties.
bool parentIsAvatar = (parentID == AVATAR_SELF_ID || parentID == myAvatarID);
if (!parentIsAvatar && (parentID.isInvalidID() ||
!entityIDs.contains(parentID) ||
!entityTree->findEntityByEntityItemID(parentID))) {
// If parent wasn't selected, we want absolute position, which isn't in properties.
auto position = entityItem->getPosition();
root.x = glm::min(root.x, position.x);
root.y = glm::min(root.y, position.y);
root.z = glm::min(root.z, position.z);
@ -4002,12 +4011,16 @@ bool Application::exportEntities(const QString& filename, const QVector<EntityIt
for (EntityItemPointer& entityDatum : entities) {
auto properties = entityDatum->getProperties();
EntityItemID parentID = properties.getParentID();
if (parentID.isInvalidID()) {
properties.setPosition(properties.getPosition() - root);
bool parentIsAvatar = (parentID == AVATAR_SELF_ID || parentID == myAvatarID);
if (parentIsAvatar) {
properties.setParentID(AVATAR_SELF_ID);
} else {
if (parentID.isInvalidID()) {
properties.setPosition(properties.getPosition() - root);
} else if (!entities.contains(parentID)) {
entityDatum->globalizeProperties(properties, "Parent %3 of %2 %1 is not selected for export.", -root);
} // else valid parent -- don't offset
}
else if (!entities.contains(parentID)) {
entityDatum->globalizeProperties(properties, "Parent %3 of %2 %1 is not selected for export.", -root);
} // else valid parent -- don't offset
exportTree->addEntity(entityDatum->getEntityItemID(), properties);
}
});

View file

@ -3238,3 +3238,9 @@ void MyAvatar::setModelScale(float scale) {
emit sensorToWorldScaleChanged(sensorToWorldScale);
}
}
SpatialParentTree* MyAvatar::getParentTree() const {
auto entityTreeRenderer = qApp->getEntities();
EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr;
return entityTree.get();
}

View file

@ -544,6 +544,8 @@ public:
float getUserHeight() const;
float getUserEyeHeight() const;
virtual SpatialParentTree* getParentTree() const override;
public slots:
void increaseSize();
void decreaseSize();

View file

@ -305,3 +305,9 @@ Transform Base3DOverlay::evalRenderTransform() {
void Base3DOverlay::setRenderTransform(const Transform& transform) {
_renderTransform = transform;
}
SpatialParentTree* Base3DOverlay::getParentTree() const {
auto entityTreeRenderer = qApp->getEntities();
EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr;
return entityTree.get();
}

View file

@ -55,7 +55,7 @@ public:
virtual AABox getBounds() const override = 0;
void update(float deltatime) override;
void notifyRenderTransformChange() const;
void setProperties(const QVariantMap& properties) override;
@ -69,6 +69,8 @@ public:
return findRayIntersection(origin, direction, distance, face, surfaceNormal);
}
virtual SpatialParentTree* getParentTree() const override;
protected:
virtual void locationChanged(bool tellPhysics = true) override;
virtual void parentDeleted() override;

View file

@ -45,7 +45,7 @@ void EntityEditPacketSender::queueEditAvatarEntityMessage(PacketType type,
}
EntityItemPointer entity = entityTree->findEntityByEntityItemID(entityItemID);
if (!entity) {
qCDebug(entities) << "EntityEditPacketSender::queueEditEntityMessage can't find entity.";
qCDebug(entities) << "EntityEditPacketSender::queueEditAvatarEntityMessage can't find entity: " << entityItemID;
return;
}

View file

@ -1848,7 +1848,13 @@ bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void
QHash<EntityItemID, EntityItemID>::iterator iter = args->map->find(oldID);
if (iter == args->map->end()) {
EntityItemID newID = QUuid::createUuid();
EntityItemID newID;
if (oldID == AVATAR_SELF_ID) {
auto nodeList = DependencyManager::get<NodeList>();
newID = EntityItemID(nodeList->getSessionUUID());
} else {
newID = QUuid::createUuid();
}
args->map->insert(oldID, newID);
return newID;
}
@ -1865,8 +1871,8 @@ bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void
properties.setPosition(properties.getPosition() + args->root);
} else {
EntityItemPointer parentEntity = args->ourTree->findEntityByEntityItemID(oldParentID);
if (parentEntity) { // map the parent
properties.setParentID(getMapped(parentEntity->getID()));
if (parentEntity || oldParentID == AVATAR_SELF_ID) { // map the parent
properties.setParentID(getMapped(oldParentID));
// But do not add root offset in this case.
} else { // Should not happen, but let's try to be helpful...
item->globalizeProperties(properties, "Cannot find %3 parent of %2 %1", args->root);
@ -1941,6 +1947,12 @@ bool EntityTree::readFromMap(QVariantMap& map) {
entityItemID = EntityItemID(QUuid::createUuid());
}
if (properties.getClientOnly()) {
auto nodeList = DependencyManager::get<NodeList>();
const QUuid myNodeID = nodeList->getSessionUUID();
properties.setOwningAvatarID(myNodeID);
}
EntityItemPointer entity = addEntity(entityItemID, properties);
if (!entity) {
qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType();

View file

@ -102,8 +102,11 @@ SpatiallyNestablePointer SpatiallyNestable::getParentPointer(bool& success) cons
if (parent && parent->getID() == parentID) {
// parent pointer is up-to-date
if (!_parentKnowsMe) {
parent->beParentOfChild(getThisPointer());
_parentKnowsMe = true;
SpatialParentTree* parentTree = parent->getParentTree();
if (!parentTree || parentTree == getParentTree()) {
parent->beParentOfChild(getThisPointer());
_parentKnowsMe = true;
}
}
success = true;
return parent;
@ -129,8 +132,15 @@ SpatiallyNestablePointer SpatiallyNestable::getParentPointer(bool& success) cons
parent = _parent.lock();
if (parent) {
parent->beParentOfChild(getThisPointer());
_parentKnowsMe = true;
// it's possible for an entity with a parent of AVATAR_SELF_ID can be imported into a side-tree
// such as the clipboard's. if this is the case, we don't want the parent to consider this a
// child.
SpatialParentTree* parentTree = parent->getParentTree();
if (!parentTree || parentTree == getParentTree()) {
parent->beParentOfChild(getThisPointer());
_parentKnowsMe = true;
}
}
success = (parent || parentID.isNull());

View file

@ -222,7 +222,7 @@ getControllerJointIndex = function (hand) {
return controllerJointIndex;
}
return MyAvatar.getJointIndex("Head");
return -1;
};
propsArePhysical = function (props) {