bookmark avatar-entities-done

This commit is contained in:
Dante Ruiz 2018-01-17 15:42:07 -08:00
parent 3ba0eaa13d
commit eadd3b48bd
3 changed files with 34 additions and 46 deletions

View file

@ -25,6 +25,7 @@
#include <EntityTree.h>
#include <PhysicalEntitySimulation.h>
#include <EntityEditPacketSender.h>
#include <VariantMapToScriptValue.h>
#include "MainWindow.h"
#include "Menu.h"
@ -35,7 +36,7 @@
#include <QtQuick/QQuickWindow>
void addAvatarEntities(const QVariantList& avatarEntities, std::shared_ptr<MyAvatar> myAvatar) {
void addAvatarEntities(const QVariantList& avatarEntities) {
auto nodeList = DependencyManager::get<NodeList>();
const QUuid myNodeID = nodeList->getSessionUUID();
EntityTreePointer entityTree = DependencyManager::get<EntityTreeRenderer>()->getTree();
@ -45,32 +46,20 @@ void addAvatarEntities(const QVariantList& avatarEntities, std::shared_ptr<MyAva
EntitySimulationPointer entitySimulation = entityTree->getSimulation();
PhysicalEntitySimulationPointer physicalEntitySimulation = std::static_pointer_cast<PhysicalEntitySimulation>(entitySimulation);
EntityEditPacketSender* entityPacketSender = physicalEntitySimulation->getPacketSender();
QScriptEngine scriptEngine;
for (int index = 0; index < avatarEntities.count(); index++) {
const QVariantList& avatarEntityProperties = avatarEntities.at(index).toList();
const QVariantMap& avatarEntityProperties = avatarEntities.at(index).toMap();
QVariant variantProperties = avatarEntityProperties["properties"];
QVariantMap asMap = variantProperties.toMap();
QScriptValue scriptProperties = variantMapToScriptValue(asMap, scriptEngine);
EntityItemProperties entityProperties;
EntityItemPropertiesFromScriptValueHonorReadOnly(scriptProperties, entityProperties);
entityProperties.setParentID(myNodeID);
QString typeName = avatarEntityProperties.value(0).toString();
entityProperties.setType(EntityTypes::getEntityTypeFromName(typeName));
QString marketplaceID = avatarEntityProperties.value(1).toString();
entityProperties.setMarketplaceID(marketplaceID);
int editionNumber = avatarEntityProperties.value(2).toInt();
entityProperties.setEditionNumber(editionNumber);
QString modelURL = avatarEntityProperties.value(3).toString();
entityProperties.setModelURL(modelURL);
int parentJointIndex = avatarEntityProperties.value(4).toInt();
entityProperties.setParentJointIndex(parentJointIndex);
glm::vec3 jointPosition = myAvatar->getJointPosition(parentJointIndex);
glm::vec3 positionOffset = vec3FromJsonValue(avatarEntityProperties.value(5).toJsonValue());
glm::vec3 finalPosition = jointPosition + positionOffset;
entityProperties.setPosition(finalPosition);
glm::quat jointRotation = myAvatar->getJointRotation(parentJointIndex);
glm::quat rotationOffset = quatFromJsonValue(avatarEntityProperties.value(6).toJsonValue());
glm::quat finalRotation = jointRotation * rotationOffset;
entityProperties.setRotation(finalRotation);
QString userData = avatarEntityProperties.value(7).toString();
entityProperties.setUserData(userData);
glm::vec3 dimensions = vec3FromJsonValue(avatarEntityProperties.value(8).toJsonValue());
entityProperties.setDimensions(dimensions);
entityProperties.setClientOnly(true);
entityProperties.setOwningAvatarID(myNodeID);
entityProperties.setSimulationOwner(myNodeID, AVATAR_ENTITY_SIMULATION_PRIORITY);
entityProperties.markAllChanged();
EntityItemID id = EntityItemID(QUuid::createUuid());
bool success = true;
@ -146,10 +135,11 @@ void AvatarEntitiesBookmarks::applyBookmarkedAvatarEntities() {
const QMap<QString, QVariant> bookmark = action->data().toMap();
if (bookmark.value(ENTRY_VERSION) == AVATAR_ENTITIES_BOOKMARK_VERSION) {
myAvatar->removeAvatarEntities();
const QString& avatarUrl = bookmark.value(ENTRY_AVATAR_URL, "").toString();
myAvatar->useFullAvatarURL(avatarUrl);
const QVariantList& avatarEntities = bookmark.value(ENTRY_AVATAR_ENTITIES, QVariantList()).toList();
addAvatarEntities(avatarEntities, myAvatar);
addAvatarEntities(avatarEntities);
const float& avatarScale = bookmark.value(ENTRY_AVATAR_SCALE, 1.0f).toFloat();
myAvatar->setAvatarScale(avatarScale);
} else {

View file

@ -1422,34 +1422,31 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
}
void MyAvatar::removeAvatarEntities() {
auto treeRenderer = DependencyManager::get<EntityTreeRenderer>();
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;
if (entityTree) {
entityTree->withWriteLock([&] {
AvatarEntityMap avatarEntities = getAvatarEntityData();
for (auto entityID : avatarEntities.keys()) {
entityTree->deleteEntity(entityID, true, true);
}
});
}
}
QVariantList MyAvatar::getAvatarEntitiesVariant() {
QVariantList avatarEntitiesData;
QScriptEngine scriptEngine;
forEachChild([&](SpatiallyNestablePointer child) {
if (child->getNestableType() == NestableType::Entity) {
auto modelEntity = std::dynamic_pointer_cast<ModelEntityItem>(child);
if (modelEntity) {
QVariantList avatarEntityProperties;
QVariantMap avatarEntityData;
EntityItemProperties entityProperties = modelEntity->getProperties();
// calculate the entity offset from the parentJointIndex
int jointIndex = entityProperties.getParentJointIndex();
glm::quat jointRotation = getJointRotation(jointIndex);
glm::quat entityRotation = modelEntity->getWorldOrientation();
glm::vec3 jointPosition = getJointPosition(jointIndex);
glm::vec3 entityPosition = modelEntity->getWorldPosition();
glm::quat rotationOffset = glm::inverse(jointRotation) * entityRotation;
glm::vec3 positionOffset = entityPosition - jointPosition;
avatarEntityProperties.append(QVariant(EntityTypes::getEntityTypeName(entityProperties.getType())));
avatarEntityProperties.append(QVariant(entityProperties.getMarketplaceID()));
avatarEntityProperties.append(QVariant(entityProperties.getEditionNumber()));
avatarEntityProperties.append(QVariant(entityProperties.getModelURL()));
avatarEntityProperties.append(QVariant(jointIndex));
avatarEntityProperties.append(QVariant(toJsonValue(positionOffset)));
avatarEntityProperties.append(QVariant(toJsonValue(rotationOffset)));
avatarEntityProperties.append(QVariant(entityProperties.getUserData()));
avatarEntityProperties.append(QVariant(toJsonValue(entityProperties.getDimensions())));
avatarEntitiesData.append(QVariant(avatarEntityProperties));
QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(&scriptEngine, entityProperties);
avatarEntityData["properties"] = scriptProperties.toVariant();
avatarEntitiesData.append(QVariant(avatarEntityData));
}
}
});

View file

@ -511,6 +511,7 @@ public:
bool hasDriveInput() const;
QVariantList getAvatarEntitiesVariant();
void removeAvatarEntities();
Q_INVOKABLE bool isFlying();
Q_INVOKABLE bool isInAir();