From 5facb39aa7b6cc0d5b0baa27a3643a72ff713ad3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 10 Mar 2015 12:21:37 -0700 Subject: [PATCH] support for import entities from network URL --- examples/editEntities.js | 24 +++++++++++++++++- interface/src/Application.cpp | 2 +- libraries/octree/src/Octree.cpp | 43 ++++++++++++++++++++++++++++++--- libraries/octree/src/Octree.h | 2 ++ 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 689f73eed4..a2ecd7ff02 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -699,7 +699,7 @@ function setupModelMenus() { Menu.addMenuItem({ menuName: "File", menuItemName: "Models", isSeparator: true, beforeItem: "Settings" }); Menu.addMenuItem({ menuName: "File", menuItemName: "Export Entities", shortcutKey: "CTRL+META+E", afterItem: "Models" }); Menu.addMenuItem({ menuName: "File", menuItemName: "Import Entities", shortcutKey: "CTRL+META+I", afterItem: "Export Entities" }); - + Menu.addMenuItem({ menuName: "File", menuItemName: "Import Entities from URL", shortcutKey: "CTRL+META+U", afterItem: "Import Entities" }); Menu.addMenuItem({ menuName: "View", menuItemName: MENU_AUTO_FOCUS_ON_SELECT, afterItem: MENU_INSPECT_TOOL_ENABLED, isCheckable: true, isChecked: Settings.getValue(SETTING_AUTO_FOCUS_ON_SELECT) == "true" }); @@ -800,6 +800,28 @@ function handeMenuEvent(menuItem) { if (filename) { var success = Clipboard.importEntities(filename); + if (success) { + var distance = cameraManager.enabled ? cameraManager.zoomDistance : DEFAULT_ENTITY_DRAG_DROP_DISTANCE; + var direction = Quat.getFront(Camera.orientation); + var offset = Vec3.multiply(distance, direction); + var position = Vec3.sum(Camera.position, offset); + + position.x = Math.max(0, position.x); + position.y = Math.max(0, position.y); + position.z = Math.max(0, position.z); + + var pastedEntityIDs = Clipboard.pasteEntities(position); + + selectionManager.setSelections(pastedEntityIDs); + } else { + Window.alert("There was an error importing the entity file."); + } + } + } else if (menuItem == "Import Entities from URL") { + var url = Window.prompt("URL of SVO to import", ""); + if (url) { + var success = Clipboard.importEntities(url); + if (success) { var distance = cameraManager.enabled ? cameraManager.zoomDistance : DEFAULT_ENTITY_DRAG_DROP_DISTANCE; var direction = Quat.getFront(Camera.orientation); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6945e88949..4662f92427 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1723,7 +1723,7 @@ void Application::saveSettings() { bool Application::importEntities(const QString& filename) { _entityClipboard.eraseAllOctreeElements(); - bool success = _entityClipboard.readFromSVOFile(filename.toLocal8Bit().constData()); + bool success = _entityClipboard.readFromSVOURL(filename); if (success) { _entityClipboard.reaverageOctreeElements(); } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 6c36b28c7a..fddbe0bef5 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -20,13 +20,18 @@ #include #include +#include #include #include +#include +#include +#include #include #include -#include #include +#include +#include #include #include #include @@ -1862,6 +1867,38 @@ bool Octree::readFromSVOFile(const char* fileName) { return fileOk; } +bool Octree::readFromSVOURL(const QString& urlString) { + bool readOk = false; + + // determine if this is a local file or a network resource + QUrl url(urlString); + + if (url.isLocalFile()) { + readOk = readFromSVOFile(qPrintable(url.toLocalFile())); + } else { + QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + request.setUrl(url); + + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(request); + + qDebug() << "Downloading svo at" << qPrintable(urlString); + + QEventLoop loop; + QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + + if (reply->error() == QNetworkReply::NoError) { + int resourceSize = reply->bytesAvailable(); + QDataStream inputStream(reply); + readOk = readFromStream(resourceSize, inputStream); + } + } + return readOk; +} + + bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream) { bool fileOk = false; @@ -1881,9 +1918,7 @@ bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream // read just enough of the file to parse the header... const unsigned long HEADER_LENGTH = sizeof(PacketType) + sizeof(PacketVersion); unsigned char fileHeader[HEADER_LENGTH]; - //file.read((char*)&fileHeader, HEADER_LENGTH); - int bytesRead = inputStream.readRawData((char*)&fileHeader, HEADER_LENGTH); - qDebug() << "HEADER_LENGTH... bytesRead:" << bytesRead; + inputStream.readRawData((char*)&fileHeader, HEADER_LENGTH); headerLength = HEADER_LENGTH; // we need this later to skip to the data diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index c4e4e2205b..672a3b63d5 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -326,7 +326,9 @@ public: // these will read/write files that match the wireformat, excluding the 'V' leading void writeToSVOFile(const char* filename, OctreeElement* element = NULL); + bool readFromSVOFile(const char* filename); + bool readFromSVOURL(const QString& url); // will support file urls as well... bool readFromStream(unsigned long streamLength, QDataStream& inputStream);