From 080774387d1e0c455bc6a8701ab4ee77f4bcc025 Mon Sep 17 00:00:00 2001 From: elmanytas Date: Sun, 9 Sep 2018 08:22:58 +0200 Subject: [PATCH 01/70] Added steps to run interface in Ubuntu 18.04 . --- BUILD_LINUX.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md index 1ee3d2b7c8..ea8171cf57 100644 --- a/BUILD_LINUX.md +++ b/BUILD_LINUX.md @@ -86,19 +86,73 @@ In a server, it does not make sense to compile interface ### Running the software +#### Domain server + Running domain server: ```bash ./domain-server/domain-server ``` +#### Assignment clients + Running assignment client: ```bash ./assignment-client/assignment-client -n 6 ``` +#### Interface + Running interface: ```bash ./interface/interface ``` Go to localhost in the running interface. + +##### Ubuntu 18.04 only + +In Ubuntu 18.04 there is a problem related with NVidia driver library version. + +It can be workarounded following these steps: + +Uninstall incompatible nvtt libraries: +```bash +sudo apt-get remove libnvtt2 libnvtt-dev +``` + +Install libssl1.0-dev: +```bash +sudo apt-get -y install libssl1.0-dev +``` + +Clone castano nvidia-texture-tools: +``` +git clone https://github.com/castano/nvidia-texture-tools +cd nvidia-texture-tools/ +``` + +Make these changes in repo: +* In file **VERSION** set `2.2.1` +* In file **configure**: + * set `build="release"` + * set `-DNVTT_SHARED=1` + +Configure, build and install: +``` +./configure +make +sudo make install +``` + +Link compiled files: +``` +sudo ln -s /usr/local/lib/libnvcore.so /usr/lib/libnvcore.so +sudo ln -s /usr/local/lib/libnvimage.so /usr/lib/libnvimage.so +sudo ln -s /usr/local/lib/libnvmath.so /usr/lib/libnvmath.so +sudo ln -s /usr/local/lib/libnvtt.so /usr/lib/libnvtt.so +``` + +After running this steps you can run interface: +``` +interface/interface +``` From f900a81e7ad282dbad5c7fcfd1be58f081a04826 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 14 Nov 2018 15:33:40 -0800 Subject: [PATCH 02/70] Add ModelLoader --- .../src/model-networking/ModelLoader.cpp | 52 +++++++++++ .../src/model-networking/ModelLoader.h | 87 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 libraries/model-networking/src/model-networking/ModelLoader.cpp create mode 100644 libraries/model-networking/src/model-networking/ModelLoader.h diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp new file mode 100644 index 0000000000..3eb1bec9f0 --- /dev/null +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -0,0 +1,52 @@ +// +// ModelLoader.cpp +// libraries/model-networking/src/model-networking +// +// Created by Sabrina Shanman on 2018/11/14. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ModelLoader.h" + +hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { + // Check file contents + for (auto& supportedFormat : supportedFormats) { + for (auto& fileSignature : supportedFormat.mimeType.fileSignatures) { + auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); + if (testBytes == fileSignature.bytes) { + return supportedFormat.loader(data, mapping, url); + } + } + } + + // Check file extension + std::string urlString = url.path().toStdString(); + std::size_t extensionSeparator = urlString.rfind('.'); + if (extensionSeparator != std::string::npos) { + std::string detectedExtension = urlString.substr(extensionSeparator + 1); + for (auto& supportedFormat : supportedFormats) { + for (auto& extension : supportedFormat.mimeType.extensions) { + if (extension == detectedExtension) { + return supportedFormat.loader(data, mapping, url); + } + } + } + } + + // Check web media type + if (webMediaType != "") { + for (auto& supportedFormat : supportedFormats) { + for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { + if (candidateWebMediaType == webMediaType) { + return supportedFormat.loader(data, mapping, url); + } + } + } + } + + // Supported file type not found. Abort loading. + return hfm::Model::Pointer(); +} diff --git a/libraries/model-networking/src/model-networking/ModelLoader.h b/libraries/model-networking/src/model-networking/ModelLoader.h new file mode 100644 index 0000000000..1a8901e8da --- /dev/null +++ b/libraries/model-networking/src/model-networking/ModelLoader.h @@ -0,0 +1,87 @@ +// +// ModelLoader.h +// libraries/model-networking/src/model-networking +// +// Created by Sabrina Shanman on 2018/11/13. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ModelLoader_h +#define hifi_ModelLoader_h + +#include +#include +#include + +#include +#include + +class ModelLoader { +public: + + // A short sequence of bytes, typically at the beginning of the file, which identifies the file format + class FileSignature { + public: + FileSignature(const std::string& bytes, int byteOffset) : + bytes(bytes), + byteOffset(byteOffset) { + } + + std::string bytes; + int byteOffset; + }; + + // A named file extension with a list of known ways to positively identify the file type + class MIMEType { + public: + MIMEType(const std::string& name) : + name(name) { + } + + std::string name; + std::vector extensions; + std::vector webMediaTypes; + std::vector fileSignatures; + }; + + // T is a subclass of hfm::Serializer + template + void addSupportedFormat(const MIMEType& mimeType) { + supportedFormats.push_back(SupportedFormat(mimeType, SupportedFormat::getLoader())); + } + + // Given the currently stored list of supported file formats, determine how to load a model from the given parameters. + // If successful, return an owned reference to the newly loaded model. + // If failed, return an empty reference. + hfm::Model::Pointer load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + +protected: + using Loader = std::function; + + class SupportedFormat { + public: + SupportedFormat(const MIMEType& mimeType, const Loader& loader) : + mimeType(mimeType), + loader(loader) { + } + + MIMEType mimeType; + Loader loader; + + template + static Loader getLoader() { + assert(dynamic_cast(&T())); + + return [](const hifi::ByteArray& bytes, const hifi::VariantHash& mapping, const hifi::URL& url) -> hfm::Model::Pointer { + return T().read(bytes, mapping, url); + }; + } + }; + + std::vector supportedFormats; +}; + +#endif // hifi_ModelLoader_h From fc0a31fa0de40879235a8c828598750acda25a06 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 14 Nov 2018 17:21:47 -0800 Subject: [PATCH 03/70] Define ModelLoader instance in ModelCache --- .../src/model-networking/ModelCache.cpp | 16 ++++++++++++++++ .../src/model-networking/ModelCache.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 254f61eba9..53a0ec14a1 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -316,6 +316,22 @@ ModelCache::ModelCache() { const qint64 GEOMETRY_DEFAULT_UNUSED_MAX_SIZE = DEFAULT_UNUSED_MAX_SIZE; setUnusedResourceCacheSize(GEOMETRY_DEFAULT_UNUSED_MAX_SIZE); setObjectName("ModelCache"); + + // Add supported model formats + + ModelLoader::MIMEType fbxMIMEType("fbx"); + fbxMIMEType.extensions.push_back("fbx"); + fbxMIMEType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); + _modelLoader.addSupportedFormat(fbxMIMEType); + + ModelLoader::MIMEType objMIMEType("obj"); + objMIMEType.extensions.push_back("obj"); + _modelLoader.addSupportedFormat(objMIMEType); + + ModelLoader::MIMEType gltfMIMEType("gltf"); + gltfMIMEType.extensions.push_back("gltf"); + gltfMIMEType.webMediaTypes.push_back("model/gltf+json"); + _modelLoader.addSupportedFormat(gltfMIMEType); } QSharedPointer ModelCache::createResource(const QUrl& url, const QSharedPointer& fallback, diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 9d458e7512..1018bdecd5 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -20,6 +20,7 @@ #include "FBXSerializer.h" #include "TextureCache.h" +#include "ModelLoader.h" // Alias instead of derive to avoid copying @@ -158,6 +159,7 @@ protected: private: ModelCache(); virtual ~ModelCache() = default; + ModelLoader _modelLoader; }; class NetworkMaterial : public graphics::Material { From 2387641cbbbb8b264c752a73e98bc97606c996d7 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 15 Nov 2018 14:52:27 -0800 Subject: [PATCH 04/70] Store the MIME type in HTTPResourceRequest::onRequestFinished() --- .../networking/src/HTTPResourceRequest.cpp | 21 ++++++++++++++++++- libraries/networking/src/ResourceRequest.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/HTTPResourceRequest.cpp b/libraries/networking/src/HTTPResourceRequest.cpp index e26f27adcf..50221a136a 100644 --- a/libraries/networking/src/HTTPResourceRequest.cpp +++ b/libraries/networking/src/HTTPResourceRequest.cpp @@ -94,7 +94,7 @@ void HTTPResourceRequest::onRequestFinished() { // Content-Range: -/* // Content-Range: */ // - auto parseContentRangeHeader = [](QString contentRangeHeader) -> std::pair { + static auto parseContentRangeHeader = [](QString contentRangeHeader) -> std::pair { auto unitRangeParts = contentRangeHeader.split(' '); if (unitRangeParts.size() != 2) { return { false, 0 }; @@ -115,6 +115,15 @@ void HTTPResourceRequest::onRequestFinished() { } }; + static auto parseMediaType = [](QString contentTypeHeader) -> std::pair { + auto contentTypeParts = contentTypeHeader.split(';'); + if (contentTypeParts.size() < 1) { + return { false, "" }; + } + + return { true, contentTypeParts[0] }; + }; + switch(_reply->error()) { case QNetworkReply::NoError: _data = _reply->readAll(); @@ -141,6 +150,16 @@ void HTTPResourceRequest::onRequestFinished() { } } + { + auto contentTypeHeader = _reply->rawHeader("Content-Type"); + bool success; + QString mediaType; + std::tie(success, mediaType) = parseMediaType(contentTypeHeader); + if (success) { + _webMediaType = mediaType; + } + } + recordBytesDownloadedInStats(STAT_HTTP_RESOURCE_TOTAL_BYTES, _data.size()); break; diff --git a/libraries/networking/src/ResourceRequest.h b/libraries/networking/src/ResourceRequest.h index eb306ca5be..550294d79b 100644 --- a/libraries/networking/src/ResourceRequest.h +++ b/libraries/networking/src/ResourceRequest.h @@ -84,6 +84,7 @@ public: bool loadedFromCache() const { return _loadedFromCache; } bool getRangeRequestSuccessful() const { return _rangeRequestSuccessful; } bool getTotalSizeOfResource() const { return _totalSizeOfResource; } + QString getWebMediaType() const { return _webMediaType; } void setFailOnRedirect(bool failOnRedirect) { _failOnRedirect = failOnRedirect; } void setCacheEnabled(bool value) { _cacheEnabled = value; } @@ -111,6 +112,7 @@ protected: ByteRange _byteRange; bool _rangeRequestSuccessful { false }; uint64_t _totalSizeOfResource { 0 }; + QString _webMediaType; int64_t _lastRecordedBytesDownloaded { 0 }; bool _isObservable; qint64 _callerId; From b3d5f2fa65689c9155259feeb5cedbba67ca51ea Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 15 Nov 2018 17:25:05 -0800 Subject: [PATCH 05/70] Add MIME type-based Serializer selection --- .../src/model-networking/ModelCache.cpp | 115 +++++++++--------- 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 53a0ec14a1..81188031e1 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -144,9 +144,9 @@ void GeometryMappingResource::onGeometryMappingLoaded(bool success) { class GeometryReader : public QRunnable { public: - GeometryReader(QWeakPointer& resource, const QUrl& url, const QVariantHash& mapping, - const QByteArray& data, bool combineParts) : - _resource(resource), _url(url), _mapping(mapping), _data(data), _combineParts(combineParts) { + GeometryReader(const ModelLoader& modelLoader, QWeakPointer& resource, const QUrl& url, const QVariantHash& mapping, + const QByteArray& data, bool combineParts, const QString& webMediaType) : + _modelLoader(modelLoader), _resource(resource), _url(url), _mapping(mapping), _data(data), _combineParts(combineParts), _webMediaType(webMediaType) { DependencyManager::get()->incrementStat("PendingProcessing"); } @@ -154,11 +154,13 @@ public: virtual void run() override; private: + ModelLoader _modelLoader; QWeakPointer _resource; QUrl _url; QVariantHash _mapping; QByteArray _data; bool _combineParts; + QString _webMediaType; }; void GeometryReader::run() { @@ -183,62 +185,54 @@ void GeometryReader::run() { throw QString("reply is NULL"); } + // Ensure the resource has not been deleted + auto resource = _resource.toStrongRef(); + if (!resource) { + qCWarning(modelnetworking) << "Abandoning load of" << _url << "; could not get strong ref"; + return; + } + QString urlname = _url.path().toLower(); - if (!urlname.isEmpty() && !_url.path().isEmpty() && - - (_url.path().toLower().endsWith(".fbx") || - _url.path().toLower().endsWith(".obj") || - _url.path().toLower().endsWith(".obj.gz") || - _url.path().toLower().endsWith(".gltf"))) { - - HFMModel::Pointer hfmModel; - - QVariantHash serializerMapping = _mapping; - serializerMapping["combineParts"] = _combineParts; - - if (_url.path().toLower().endsWith(".fbx")) { - hfmModel = FBXSerializer().read(_data, serializerMapping, _url); - if (hfmModel->meshes.size() == 0 && hfmModel->joints.size() == 0) { - throw QString("empty geometry, possibly due to an unsupported FBX version"); - } - } else if (_url.path().toLower().endsWith(".obj")) { - hfmModel = OBJSerializer().read(_data, serializerMapping, _url); - } else if (_url.path().toLower().endsWith(".obj.gz")) { - QByteArray uncompressedData; - if (gunzip(_data, uncompressedData)){ - hfmModel = OBJSerializer().read(uncompressedData, serializerMapping, _url); - } else { - throw QString("failed to decompress .obj.gz"); - } - - } else if (_url.path().toLower().endsWith(".gltf")) { - hfmModel = GLTFSerializer().read(_data, serializerMapping, _url); - if (hfmModel->meshes.size() == 0 && hfmModel->joints.size() == 0) { - throw QString("empty geometry, possibly due to an unsupported GLTF version"); - } - } else { - throw QString("unsupported format"); - } - - // Add scripts to hfmModel - if (!_mapping.value(SCRIPT_FIELD).isNull()) { - QVariantList scripts = _mapping.values(SCRIPT_FIELD); - for (auto &script : scripts) { - hfmModel->scripts.push_back(script.toString()); - } - } - - // Ensure the resource has not been deleted - auto resource = _resource.toStrongRef(); - if (!resource) { - qCWarning(modelnetworking) << "Abandoning load of" << _url << "; could not get strong ref"; - } else { - QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition", - Q_ARG(HFMModel::Pointer, hfmModel)); - } - } else { + if (urlname.isEmpty() || _url.path().isEmpty()) { throw QString("url is invalid"); } + + HFMModel::Pointer hfmModel; + QVariantHash serializerMapping = _mapping; + serializerMapping["combineParts"] = _combineParts; + + if (_url.path().toLower().endsWith(".gz")) { + QByteArray uncompressedData; + if (!gunzip(_data, uncompressedData)) { + throw QString("failed to decompress .gz model"); + } + // Strip the compression extension from the path, so the loader can infer the file type from what remains. + // This is okay because we don't expect the serializer to be able to read the contents of a compressed model file. + auto strippedUrl = _url; + strippedUrl.setPath(_url.path().left(_url.path().size() - 3)); + hfmModel = _modelLoader.load(uncompressedData, serializerMapping, strippedUrl, ""); + } else { + hfmModel = _modelLoader.load(_data, serializerMapping, _url, _webMediaType.toStdString()); + } + + if (!hfmModel) { + throw QString("unsupported format"); + } + + if (hfmModel->meshes.size() == 0 && hfmModel->joints.size() == 0) { + throw QString("empty geometry, possibly due to an unsupported model version"); + } + + // Add scripts to hfmModel + if (!_mapping.value(SCRIPT_FIELD).isNull()) { + QVariantList scripts = _mapping.values(SCRIPT_FIELD); + for (auto &script : scripts) { + hfmModel->scripts.push_back(script.toString()); + } + } + + QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition", + Q_ARG(HFMModel::Pointer, hfmModel)); } catch (const std::exception&) { auto resource = _resource.toStrongRef(); if (resource) { @@ -258,8 +252,8 @@ void GeometryReader::run() { class GeometryDefinitionResource : public GeometryResource { Q_OBJECT public: - GeometryDefinitionResource(const QUrl& url, const QVariantHash& mapping, const QUrl& textureBaseUrl, bool combineParts) : - GeometryResource(url, resolveTextureBaseUrl(url, textureBaseUrl)), _mapping(mapping), _combineParts(combineParts) {} + GeometryDefinitionResource(const ModelLoader& modelLoader, const QUrl& url, const QVariantHash& mapping, const QUrl& textureBaseUrl, bool combineParts) : + GeometryResource(url, resolveTextureBaseUrl(url, textureBaseUrl)), _modelLoader(modelLoader), _mapping(mapping), _combineParts(combineParts) {} QString getType() const override { return "GeometryDefinition"; } @@ -269,6 +263,7 @@ protected: Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel); private: + ModelLoader _modelLoader; QVariantHash _mapping; bool _combineParts; }; @@ -278,7 +273,7 @@ void GeometryDefinitionResource::downloadFinished(const QByteArray& data) { _url = _effectiveBaseURL; _textureBaseUrl = _effectiveBaseURL; } - QThreadPool::globalInstance()->start(new GeometryReader(_self, _effectiveBaseURL, _mapping, data, _combineParts)); + QThreadPool::globalInstance()->start(new GeometryReader(_modelLoader, _self, _effectiveBaseURL, _mapping, data, _combineParts, _request->getWebMediaType())); } void GeometryDefinitionResource::setGeometryDefinition(HFMModel::Pointer hfmModel) { @@ -344,7 +339,7 @@ QSharedPointer ModelCache::createResource(const QUrl& url, const QShar auto mapping = geometryExtra ? geometryExtra->mapping : QVariantHash(); auto textureBaseUrl = geometryExtra ? geometryExtra->textureBaseUrl : QUrl(); bool combineParts = geometryExtra ? geometryExtra->combineParts : true; - resource = new GeometryDefinitionResource(url, mapping, textureBaseUrl, combineParts); + resource = new GeometryDefinitionResource(_modelLoader, url, mapping, textureBaseUrl, combineParts); } return QSharedPointer(resource, &Resource::deleter); From 98853b5d1d97d9c3f1d31db581dd8d93251c5f91 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 26 Nov 2018 14:31:57 -0800 Subject: [PATCH 06/70] Move FBXSerializer import by AnimationCache to source file --- libraries/animation/src/AnimationCache.cpp | 1 + libraries/animation/src/AnimationCache.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/animation/src/AnimationCache.cpp b/libraries/animation/src/AnimationCache.cpp index ec26782d0e..f7a7dd861a 100644 --- a/libraries/animation/src/AnimationCache.cpp +++ b/libraries/animation/src/AnimationCache.cpp @@ -20,6 +20,7 @@ #include #include "AnimationLogging.h" +#include int animationPointerMetaTypeId = qRegisterMetaType(); diff --git a/libraries/animation/src/AnimationCache.h b/libraries/animation/src/AnimationCache.h index d4574d9d3b..2f8168625e 100644 --- a/libraries/animation/src/AnimationCache.h +++ b/libraries/animation/src/AnimationCache.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include class Animation; From d1f8bfe48bee695b70cb25ef8fccbd5089dc9dda Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 26 Nov 2018 17:45:55 -0800 Subject: [PATCH 07/70] Move definition of supported file types into ModelLoader --- .../src/model-networking/ModelCache.cpp | 19 ---------------- .../src/model-networking/ModelLoader.cpp | 22 +++++++++++++++++++ .../src/model-networking/ModelLoader.h | 2 ++ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 81188031e1..22835de59d 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -12,9 +12,6 @@ #include "ModelCache.h" #include #include -#include "FBXSerializer.h" -#include "OBJSerializer.h" -#include "GLTFSerializer.h" #include #include @@ -311,22 +308,6 @@ ModelCache::ModelCache() { const qint64 GEOMETRY_DEFAULT_UNUSED_MAX_SIZE = DEFAULT_UNUSED_MAX_SIZE; setUnusedResourceCacheSize(GEOMETRY_DEFAULT_UNUSED_MAX_SIZE); setObjectName("ModelCache"); - - // Add supported model formats - - ModelLoader::MIMEType fbxMIMEType("fbx"); - fbxMIMEType.extensions.push_back("fbx"); - fbxMIMEType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); - _modelLoader.addSupportedFormat(fbxMIMEType); - - ModelLoader::MIMEType objMIMEType("obj"); - objMIMEType.extensions.push_back("obj"); - _modelLoader.addSupportedFormat(objMIMEType); - - ModelLoader::MIMEType gltfMIMEType("gltf"); - gltfMIMEType.extensions.push_back("gltf"); - gltfMIMEType.webMediaTypes.push_back("model/gltf+json"); - _modelLoader.addSupportedFormat(gltfMIMEType); } QSharedPointer ModelCache::createResource(const QUrl& url, const QSharedPointer& fallback, diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index 3eb1bec9f0..04384acd39 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -11,6 +11,28 @@ #include "ModelLoader.h" +#include "FBXSerializer.h" +#include "OBJSerializer.h" +#include "GLTFSerializer.h" + +ModelLoader::ModelLoader() { + // Add supported model formats + + MIMEType fbxMIMEType("fbx"); + fbxMIMEType.extensions.push_back("fbx"); + fbxMIMEType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); + addSupportedFormat(fbxMIMEType); + + MIMEType objMIMEType("obj"); + objMIMEType.extensions.push_back("obj"); + addSupportedFormat(objMIMEType); + + MIMEType gltfMIMEType("gltf"); + gltfMIMEType.extensions.push_back("gltf"); + gltfMIMEType.webMediaTypes.push_back("model/gltf+json"); + addSupportedFormat(gltfMIMEType); +} + hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { // Check file contents for (auto& supportedFormat : supportedFormats) { diff --git a/libraries/model-networking/src/model-networking/ModelLoader.h b/libraries/model-networking/src/model-networking/ModelLoader.h index 1a8901e8da..2cd5460f84 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.h +++ b/libraries/model-networking/src/model-networking/ModelLoader.h @@ -47,6 +47,8 @@ public: std::vector fileSignatures; }; + ModelLoader(); + // T is a subclass of hfm::Serializer template void addSupportedFormat(const MIMEType& mimeType) { From fd83ae231b752ca1c30108555812a1d0b2f80609 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Tue, 27 Nov 2018 09:49:55 -0800 Subject: [PATCH 08/70] Fix case for ModelLoader import --- libraries/model-networking/src/model-networking/ModelLoader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/ModelLoader.h b/libraries/model-networking/src/model-networking/ModelLoader.h index 2cd5460f84..92d93a040e 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.h +++ b/libraries/model-networking/src/model-networking/ModelLoader.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include class ModelLoader { From df1083970f00e50e7aee8e4b269b16371c7e8ce9 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Tue, 27 Nov 2018 10:24:45 -0800 Subject: [PATCH 09/70] Fix assert in ModelLoader.h --- .../model-networking/src/model-networking/ModelLoader.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/ModelLoader.h b/libraries/model-networking/src/model-networking/ModelLoader.h index 92d93a040e..0deb339f15 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.h +++ b/libraries/model-networking/src/model-networking/ModelLoader.h @@ -18,6 +18,7 @@ #include #include +#include class ModelLoader { public: @@ -75,7 +76,10 @@ protected: template static Loader getLoader() { - assert(dynamic_cast(&T())); + assert([](){ + T t; + return dynamic_cast(&t) != nullptr; + }()); return [](const hifi::ByteArray& bytes, const hifi::VariantHash& mapping, const hifi::URL& url) -> hfm::Model::Pointer { return T().read(bytes, mapping, url); From 2919097f29719a5ad72211d395344ff53e43cadc Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 28 Nov 2018 15:56:56 -0800 Subject: [PATCH 10/70] Complain about empty HFMModel when EITHER meshes or joints are empty --- libraries/model-networking/src/model-networking/ModelCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 22835de59d..8dc483e43b 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -216,7 +216,7 @@ void GeometryReader::run() { throw QString("unsupported format"); } - if (hfmModel->meshes.size() == 0 && hfmModel->joints.size() == 0) { + if (hfmModel->meshes.empty() || hfmModel->joints.empty()) { throw QString("empty geometry, possibly due to an unsupported model version"); } From 9b66c14f9fdc08fc3ddbb9c057cc09e1b4efa900 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 29 Nov 2018 18:30:33 -0800 Subject: [PATCH 11/70] TEST FOR MAC CRASH ON COMPLETION OF TESTS --- libraries/audio-client/src/AudioClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 92f7a27853..2b3f56350c 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -675,6 +675,7 @@ void AudioClient::start() { } void AudioClient::stop() { + return; qCDebug(audioclient) << "AudioClient::stop(), requesting switchInputToAudioDevice() to shut down"; switchInputToAudioDevice(QAudioDeviceInfo(), true); From 142e787a9cdc585453e38eda26da7388ecfbec7f Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 29 Nov 2018 16:46:08 -0800 Subject: [PATCH 12/70] Create MIMETypeLibrary for general MIME type detection --- .../shared/src/shared/MIMETypeLibrary.cpp | 85 +++++++++++++++++ libraries/shared/src/shared/MIMETypeLibrary.h | 91 +++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 libraries/shared/src/shared/MIMETypeLibrary.cpp create mode 100644 libraries/shared/src/shared/MIMETypeLibrary.h diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MIMETypeLibrary.cpp new file mode 100644 index 0000000000..4f12f373fe --- /dev/null +++ b/libraries/shared/src/shared/MIMETypeLibrary.cpp @@ -0,0 +1,85 @@ +// +// MIMETypeLibrary.cpp +// libraries/shared/src/shared +// +// Created by Sabrina Shanman on 2018/11/29. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "MIMETypeLibrary.h" + +MIMETypeLibrary::ID MIMETypeLibrary::registerMIMEType(const MIMEType& mimeType) { + ID id; + withWriteLock([&](){ + id = nextID++; + _mimeTypes.emplace_back(id, mimeType); + }); + return id; +} + +void MIMETypeLibrary::unregisterMIMEType(const MIMETypeLibrary::ID& id) { + withWriteLock([&](){ + for (auto it = _mimeTypes.begin(); it != _mimeTypes.end(); it++) { + if ((*it).id == id) { + _mimeTypes.erase(it); + break; + } + } + }); +} + +MIMEType MIMETypeLibrary::getMIMEType(const MIMETypeLibrary::ID& id) const { + return resultWithReadLock([&](){ + for (auto& supportedFormat : _mimeTypes) { + if (supportedFormat.id == id) { + return supportedFormat.mimeType; + } + } + return MIMEType::NONE; + }); +} + +MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { + return resultWithReadLock([&](){ + // Check file contents + for (auto& mimeType : _mimeTypes) { + for (auto& fileSignature : mimeType.mimeType.fileSignatures) { + auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); + if (testBytes == fileSignature.bytes) { + return mimeType.id; + } + } + } + + // Check file extension + std::string urlString = url.path().toStdString(); + std::size_t extensionSeparator = urlString.rfind('.'); + if (extensionSeparator != std::string::npos) { + std::string detectedExtension = urlString.substr(extensionSeparator + 1); + for (auto& supportedFormat : _mimeTypes) { + for (auto& extension : supportedFormat.mimeType.extensions) { + if (extension == detectedExtension) { + return supportedFormat.id; + } + } + } + } + + // Check web media type + if (webMediaType != "") { + for (auto& supportedFormat : _mimeTypes) { + for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { + if (candidateWebMediaType == webMediaType) { + return supportedFormat.id; + } + } + } + } + + // Supported file type not found. + return INVALID_ID; + }); +} diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MIMETypeLibrary.h new file mode 100644 index 0000000000..62bc28cdad --- /dev/null +++ b/libraries/shared/src/shared/MIMETypeLibrary.h @@ -0,0 +1,91 @@ +// +// MIMETypeLibrary.h +// libraries/shared/src/shared +// +// Created by Sabrina Shanman on 2018/11/28. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_MIMETypeLibrary_h +#define hifi_MIMETypeLibrary_h + +#include +#include +#include +#include + +#include "HifiTypes.h" + +#include "ReadWriteLockable.h" + +// A short sequence of bytes, typically at the beginning of the file, which identifies the file format +class FileSignature { +public: + FileSignature(const std::string& bytes, int byteOffset) : + bytes(bytes), + byteOffset(byteOffset) { + } + FileSignature(const FileSignature& fileSignature) : + bytes(fileSignature.bytes), + byteOffset(fileSignature.byteOffset) { + } + + std::string bytes; + int byteOffset; +}; + +// A named file extension with a list of known ways to positively identify the file type +class MIMEType { +public: + MIMEType(const std::string& name) : + name(name) { + } + MIMEType() {}; + MIMEType(const MIMEType& mimeType) : + name(mimeType.name), + extensions(mimeType.extensions), + webMediaTypes(mimeType.webMediaTypes), + fileSignatures(mimeType.fileSignatures) { + } + + static MIMEType NONE; + + std::string name; + std::vector extensions; + std::vector webMediaTypes; + std::vector fileSignatures; +}; + +MIMEType MIMEType::NONE = MIMEType(""); + +class MIMETypeLibrary : ReadWriteLockable { +public: + using ID = unsigned int; + static const ID INVALID_ID { 0 }; + + ID registerMIMEType(const MIMEType& mimeType); + void unregisterMIMEType(const ID& id); + + MIMEType getMIMEType(const ID& id) const; + ID findMatchingMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + +protected: + ID nextID { 1 }; + + class Entry { + public: + Entry(const ID& id, const MIMEType& mimeType) : + id(id), + mimeType(mimeType) { + } + ID id; + MIMEType mimeType; + }; + + std::vector _mimeTypes; +}; + +#endif // hifi_MIMETypeLibrary_h From 5f9f1ab092a4e36beb78dac77f72a29002c6ccdd Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 30 Nov 2018 14:43:53 -0800 Subject: [PATCH 13/70] All QDir iterators now sort in lexicographical order. --- tools/nitpick/src/AWSInterface.cpp | 10 +++++----- tools/nitpick/src/Test.cpp | 12 ++++++------ tools/nitpick/src/TestRailInterface.cpp | 4 ++-- tools/nitpick/src/TestRunner.cpp | 2 +- tools/nitpick/src/ui/Nitpick.cpp | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index e43ef8dc75..f525b7e039 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -156,7 +156,7 @@ void AWSInterface::writeTable(QTextStream& stream) { // Note that failures are processed first, then successes QStringList originalNamesFailures; QStringList originalNamesSuccesses; - QDirIterator it1(_snapshotDirectory.toStdString().c_str()); + QDirIterator it1(QDir(_snapshotDirectory, "", QDir::Name)); while (it1.hasNext()) { QString nextDirectory = it1.next(); @@ -204,7 +204,7 @@ void AWSInterface::writeTable(QTextStream& stream) { QDir().rename(originalNamesSuccesses[i], _htmlSuccessesFolder + "/" + newNamesSuccesses[i]); } - QDirIterator it2((_htmlFailuresFolder).toStdString().c_str()); + QDirIterator it2(QDir(_htmlFailuresFolder, "", QDir::Name)); while (it2.hasNext()) { QString nextDirectory = it2.next(); @@ -239,7 +239,7 @@ void AWSInterface::writeTable(QTextStream& stream) { stream << "\t" << "\t" << "\n"; stream << "\t" << "\t" << "

The following tests passed:

"; - QDirIterator it3((_htmlSuccessesFolder).toStdString().c_str()); + QDirIterator it3(QDir(_htmlSuccessesFolder, "", QDir::Name)); while (it3.hasNext()) { QString nextDirectory = it3.next(); @@ -337,7 +337,7 @@ void AWSInterface::updateAWS() { stream << "import boto3\n"; stream << "s3 = boto3.resource('s3')\n\n"; - QDirIterator it1(_htmlFailuresFolder.toStdString().c_str()); + QDirIterator it1(QDir(_htmlFailuresFolder, "", QDir::Name)); while (it1.hasNext()) { QString nextDirectory = it1.next(); @@ -372,7 +372,7 @@ void AWSInterface::updateAWS() { } } - QDirIterator it2(_htmlSuccessesFolder.toStdString().c_str()); + QDirIterator it2(QDir(_htmlSuccessesFolder, "", QDir::Name)); while (it2.hasNext()) { QString nextDirectory = it2.next(); diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index e17978d9d0..976add4200 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -542,7 +542,7 @@ void Test::createAllMDFiles() { createMDFile(_testsRootDirectory); } - QDirIterator it(_testsRootDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -636,7 +636,7 @@ void Test::createAllTestAutoScripts() { createTestAutoScript(_testsRootDirectory); } - QDirIterator it(_testsRootDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -704,7 +704,7 @@ void Test::createAllRecursiveScripts() { createRecursiveScript(_testsRootDirectory, false); - QDirIterator it(_testsRootDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -716,7 +716,7 @@ void Test::createAllRecursiveScripts() { // Only process directories that have sub-directories bool hasNoSubDirectories{ true }; - QDirIterator it2(directory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it2(QDir(directory, "", QDir::Name), QDirIterator::Subdirectories); while (it2.hasNext()) { QString directory2 = it2.next(); @@ -787,7 +787,7 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact testFound = true; } - QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it(QDir(topLevelDirectory, "", QDir::Name), QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -858,7 +858,7 @@ void Test::createTestsOutline() { int rootDepth { _testDirectory.count('/') }; // Each test is shown as the folder name linking to the matching GitHub URL, and the path to the associated test.md file - QDirIterator it(_testDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + QDirIterator it(QDir(_testDirectory, "", QDir::Name), QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); diff --git a/tools/nitpick/src/TestRailInterface.cpp b/tools/nitpick/src/TestRailInterface.cpp index a0c0d74526..f2e895d17e 100644 --- a/tools/nitpick/src/TestRailInterface.cpp +++ b/tools/nitpick/src/TestRailInterface.cpp @@ -275,7 +275,7 @@ void TestRailInterface::processDirectoryPython(const QString& directory, const QString& userGitHub, const QString& branchGitHub) { // Loop over all entries in directory - QDirIterator it(directory.toStdString().c_str()); + QDirIterator it(QDir(directory, "", QDir::Name)); while (it.hasNext()) { QString nextDirectory = it.next(); @@ -855,7 +855,7 @@ QDomElement TestRailInterface::processDirectoryXML(const QString& directory, QDomElement result = element; // Loop over all entries in directory - QDirIterator it(directory.toStdString().c_str()); + QDirIterator it(QDir(directory, "", QDir::Name)); while (it.hasNext()) { QString nextDirectory = it.next(); diff --git a/tools/nitpick/src/TestRunner.cpp b/tools/nitpick/src/TestRunner.cpp index 12bdf87495..d3c05483f9 100644 --- a/tools/nitpick/src/TestRunner.cpp +++ b/tools/nitpick/src/TestRunner.cpp @@ -366,7 +366,7 @@ void TestRunner::createSnapshotFolder() { // Note that we cannot use just a `png` filter, as the filenames include periods // Also, delete any `jpg` and `txt` files // The idea is to leave only previous zipped result folders - QDirIterator it(_snapshotFolder.toStdString().c_str()); + QDirIterator it(QDir(_snapshotFolder, "", QDir::Name)); while (it.hasNext()) { QString filename = it.next(); if (filename.right(4) == ".png" || filename.right(4) == ".jpg" || filename.right(4) == ".txt") { diff --git a/tools/nitpick/src/ui/Nitpick.cpp b/tools/nitpick/src/ui/Nitpick.cpp index 201d6e562d..cdd2ff89d9 100644 --- a/tools/nitpick/src/ui/Nitpick.cpp +++ b/tools/nitpick/src/ui/Nitpick.cpp @@ -36,7 +36,7 @@ Nitpick::Nitpick(QWidget* parent) : QMainWindow(parent) { _ui.statusLabel->setText(""); _ui.plainTextEdit->setReadOnly(true); - setWindowTitle("Nitpick - v1.1"); + setWindowTitle("Nitpick - v1.2"); // Coming soon to a nitpick near you... //// _helpWindow.textBrowser->setText() From d1ac50196742e3a58152258373483b922798b58e Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 29 Nov 2018 16:51:56 -0800 Subject: [PATCH 14/70] Create hfm::FormatRegistry, for more general model format definition --- libraries/hfm/src/hfm/HFMFormat.h | 25 ++++++++++ libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 52 +++++++++++++++++++++ libraries/hfm/src/hfm/HFMFormatRegistry.h | 48 +++++++++++++++++++ libraries/hfm/src/hfm/HFMSerializer.h | 6 +++ 4 files changed, 131 insertions(+) create mode 100644 libraries/hfm/src/hfm/HFMFormat.h create mode 100644 libraries/hfm/src/hfm/HFMFormatRegistry.cpp create mode 100644 libraries/hfm/src/hfm/HFMFormatRegistry.h diff --git a/libraries/hfm/src/hfm/HFMFormat.h b/libraries/hfm/src/hfm/HFMFormat.h new file mode 100644 index 0000000000..4430bca3f4 --- /dev/null +++ b/libraries/hfm/src/hfm/HFMFormat.h @@ -0,0 +1,25 @@ +// +// HFMFormat.h +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HFMFormat_h +#define hifi_HFMFormat_h + +#include "HFMFormatRegistry.h" + +namespace hfm { + class Format { + public: + virtual void registerFormat(FormatRegistry& registry) = 0; + virtual void unregisterFormat(FormatRegistry& registry) = 0; + }; +}; + +#endif // hifi_HFMFormat_h diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp new file mode 100644 index 0000000000..08f13c414a --- /dev/null +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -0,0 +1,52 @@ +// +// HFMFormatRegistry.cpp +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/29. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "HFMFormatRegistry.h" + +namespace hfm { + +FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, const std::shared_ptr& supportedFactory) { + MIMETypeID id = _mimeTypeLibrary.registerMIMEType(mimeType); + withWriteLock([&](){ + _supportedFormats.emplace_back(id, supportedFactory); + }); + return id; +} + +void FormatRegistry::unregisterMIMEType(const MIMETypeID& mimeTypeID) { + withWriteLock([&](){ + for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { + if ((*it).mimeTypeID == mimeTypeID) { + _supportedFormats.erase(it); + break; + } + } + }); + _mimeTypeLibrary.unregisterMIMEType(mimeTypeID); +} + +std::shared_ptr FormatRegistry::getFactoryForMIMETypeID(FormatRegistry::MIMETypeID mimeTypeID) const { + return resultWithReadLock>([&](){ + for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { + if ((*it).mimeTypeID == mimeTypeID) { + return (*it).factory; + } + } + return std::shared_ptr(); + }); +} + +std::shared_ptr FormatRegistry::getFactoryForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { + MIMETypeID id = _mimeTypeLibrary.findMatchingMIMEType(data, mapping, url, webMediaType); + return getFactoryForMIMETypeID(id); +} + +}; diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h new file mode 100644 index 0000000000..e807d98c46 --- /dev/null +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -0,0 +1,48 @@ +// +// HFMFormatRegistry.h +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/28. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HFMFormatRegistry_h +#define hifi_HFMFormatRegistry_h + +#include "HFMSerializer.h" +#include +#include + +namespace hfm { + +class FormatRegistry : public ReadWriteLockable { +public: + using MIMETypeID = MIMETypeLibrary::ID; + static const MIMETypeID INVALID_MIME_TYPE_ID { MIMETypeLibrary::INVALID_ID }; + + MIMETypeID registerMIMEType(const MIMEType& mimeType, const std::shared_ptr& supportedFactory); + void unregisterMIMEType(const MIMETypeID& id); + + std::shared_ptr getFactoryForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + std::shared_ptr getFactoryForMIMETypeID(MIMETypeID id) const; + +protected: + MIMETypeLibrary _mimeTypeLibrary; + class SupportedFormat { + public: + SupportedFormat(const MIMETypeID& mimeTypeID, const std::shared_ptr& factory) : + mimeTypeID(mimeTypeID), + factory(factory) { + } + MIMETypeID mimeTypeID; + std::shared_ptr factory; + }; + std::vector _supportedFormats; +}; + +}; + +#endif // hifi_HFMFormatRegistry_h diff --git a/libraries/hfm/src/hfm/HFMSerializer.h b/libraries/hfm/src/hfm/HFMSerializer.h index db18f21e06..a8ff4a3fa0 100644 --- a/libraries/hfm/src/hfm/HFMSerializer.h +++ b/libraries/hfm/src/hfm/HFMSerializer.h @@ -19,6 +19,12 @@ namespace hfm { class Serializer { +public: + class Factory { + public: + virtual std::shared_ptr get() = 0; + }; + virtual Model::Pointer read(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url = hifi::URL()) = 0; }; From 74015a1a5ed961aa8d5e84472bf36a8c436afde7 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 11:19:27 -0800 Subject: [PATCH 15/70] Implement hfm::Format/hfm::Factory for model serializers --- libraries/fbx/src/FBXSerializer.cpp | 16 ++++++++++++++++ libraries/fbx/src/FBXSerializer.h | 13 +++++++++++++ libraries/fbx/src/GLTFSerializer.cpp | 16 ++++++++++++++++ libraries/fbx/src/GLTFSerializer.h | 12 ++++++++++++ libraries/fbx/src/OBJSerializer.cpp | 14 ++++++++++++++ libraries/fbx/src/OBJSerializer.h | 12 ++++++++++++ 6 files changed, 83 insertions(+) diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index a9887cde15..dc39143f6b 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -1833,6 +1833,22 @@ HFMModel* FBXSerializer::extractHFMModel(const QVariantHash& mapping, const QStr return hfmModelPtr; } +void FBXFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("fbx"); + mimeType.extensions.push_back("fbx"); + mimeType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void FBXFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr FBXSerializer::Factory::get() { + return std::make_shared(); +} + HFMModel::Pointer FBXSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { QBuffer buffer(const_cast(&data)); buffer.open(QIODevice::ReadOnly); diff --git a/libraries/fbx/src/FBXSerializer.h b/libraries/fbx/src/FBXSerializer.h index c69f75cc5c..231fc5316c 100644 --- a/libraries/fbx/src/FBXSerializer.h +++ b/libraries/fbx/src/FBXSerializer.h @@ -28,6 +28,7 @@ #include "FBX.h" #include +#include #include #include @@ -94,8 +95,20 @@ public: class ExtractedMesh; +class FBXFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID { hfm::FormatRegistry::INVALID_MIME_TYPE_ID }; +}; + class FBXSerializer : public HFMSerializer { public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; + HFMModel* _hfmModel; /// Reads HFMModel from the supplied model and mapping data. /// \exception QString if an error occurs in parsing diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index 28d377c605..801adf6bc5 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -910,6 +910,22 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const QUrl& url) { return true; } +void GLTFFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("gltf"); + mimeType.extensions.push_back("gltf"); + mimeType.webMediaTypes.push_back("model/gltf+json"); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void GLTFFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr GLTFSerializer::Factory::get() { + return std::make_shared(); +} + HFMModel::Pointer GLTFSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { _url = url; diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index 1ec1183e36..154ba08e9d 100644 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "FBXSerializer.h" @@ -700,9 +701,20 @@ struct GLTFFile { } }; +class GLTFFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID; +}; + class GLTFSerializer : public QObject, public HFMSerializer { Q_OBJECT public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; GLTFSerializer(); HFMModel::Pointer read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url = QUrl()) override; private: diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/fbx/src/OBJSerializer.cpp index af8dfb5562..ae279bf0a7 100644 --- a/libraries/fbx/src/OBJSerializer.cpp +++ b/libraries/fbx/src/OBJSerializer.cpp @@ -651,6 +651,20 @@ done: return result; } +void OBJFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("obj"); + mimeType.extensions.push_back("obj"); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void OBJFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr OBJSerializer::Factory::get() { + return std::make_shared(); +} HFMModel::Pointer OBJSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { PROFILE_RANGE_EX(resource_parse, __FUNCTION__, 0xffff0000, nullptr); diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/fbx/src/OBJSerializer.h index a6fe3817ca..0a3f4c93ac 100644 --- a/libraries/fbx/src/OBJSerializer.h +++ b/libraries/fbx/src/OBJSerializer.h @@ -14,6 +14,7 @@ #include #include +#include #include "FBXSerializer.h" class OBJTokenizer { @@ -89,9 +90,20 @@ public: OBJMaterial() : shininess(0.0f), opacity(1.0f), diffuseColor(0.9f), specularColor(0.9f), emissiveColor(0.0f), illuminationModel(-1) {} }; +class OBJFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID; +}; + class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can make network requests. Q_OBJECT public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; typedef QVector FaceGroup; QVector vertices; QVector vertexColors; From 243a1d6598e69b50a59bdc5f2e571d6a1f498f7a Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 14:34:44 -0800 Subject: [PATCH 16/70] Add ModelFormatRegistry for handling model loading on the application side --- interface/src/Application.cpp | 3 ++ .../model-networking/ModelFormatRegistry.cpp | 40 +++++++++++++++++++ .../model-networking/ModelFormatRegistry.h | 29 ++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp create mode 100644 libraries/model-networking/src/model-networking/ModelFormatRegistry.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 21af28ffcb..6ff8618918 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -101,6 +101,7 @@ #include #include #include +#include #include #include #include @@ -883,6 +884,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { DependencyManager::set(NodeType::Agent, listenPort); DependencyManager::set(); DependencyManager::set(); + DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); @@ -2745,6 +2747,7 @@ Application::~Application() { DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); + DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp new file mode 100644 index 0000000000..26f5b66b48 --- /dev/null +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp @@ -0,0 +1,40 @@ +// +// ModelFormatRegistry.cpp +// libraries/model-networking/src/model-networking +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ModelFormatRegistry.h" + +#include "FBXSerializer.h" +#include "OBJSerializer.h" +#include "GLTFSerializer.h" + +ModelFormatRegistry::ModelFormatRegistry() : hfm::FormatRegistry() { + addDefaultFormats(); +} + +void ModelFormatRegistry::addDefaultFormats() { + addFormat(std::make_shared()); + addFormat(std::make_shared()); + addFormat(std::make_shared()); +} + +void ModelFormatRegistry::addFormat(const std::shared_ptr& format) { + format->registerFormat(*this); + withWriteLock([&](){ + formats.push_back(format); + }); +} + +ModelFormatRegistry::~ModelFormatRegistry() { + for (auto& format : formats) { + format->unregisterFormat(*this); + } + formats.clear(); +} diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h new file mode 100644 index 0000000000..becc53fc1b --- /dev/null +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h @@ -0,0 +1,29 @@ +// +// ModelFormatRegistry.h +// libraries/model-networking/src/model-networking +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ModelFormatRegistry_h +#define hifi_ModelFormatRegistry_h + +#include +#include + +class ModelFormatRegistry : public hfm::FormatRegistry { +public: + ModelFormatRegistry(); + ~ModelFormatRegistry(); + void addFormat(const std::shared_ptr& format); + +protected: + void addDefaultFormats(); + std::vector> formats; +}; + +#endif // hifi_ModelFormatRegistry_h From 39d1a2be6fab230de00e51b7518cc9eb1de764d0 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 16:14:14 -0800 Subject: [PATCH 17/70] Simplify ModelLoader to utilize new model format registry --- .../src/model-networking/ModelLoader.cpp | 62 ++--------------- .../src/model-networking/ModelLoader.h | 67 ------------------- 2 files changed, 6 insertions(+), 123 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index 04384acd39..ff32c3a999 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -11,64 +11,14 @@ #include "ModelLoader.h" -#include "FBXSerializer.h" -#include "OBJSerializer.h" -#include "GLTFSerializer.h" +#include +#include "ModelFormatRegistry.h" -ModelLoader::ModelLoader() { - // Add supported model formats - - MIMEType fbxMIMEType("fbx"); - fbxMIMEType.extensions.push_back("fbx"); - fbxMIMEType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); - addSupportedFormat(fbxMIMEType); - - MIMEType objMIMEType("obj"); - objMIMEType.extensions.push_back("obj"); - addSupportedFormat(objMIMEType); - - MIMEType gltfMIMEType("gltf"); - gltfMIMEType.extensions.push_back("gltf"); - gltfMIMEType.webMediaTypes.push_back("model/gltf+json"); - addSupportedFormat(gltfMIMEType); -} hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - // Check file contents - for (auto& supportedFormat : supportedFormats) { - for (auto& fileSignature : supportedFormat.mimeType.fileSignatures) { - auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); - if (testBytes == fileSignature.bytes) { - return supportedFormat.loader(data, mapping, url); - } - } + auto factory = DependencyManager::get()->getFactoryForMIMEType(data, mapping, url, webMediaType); + if (!factory) { + return hfm::Model::Pointer(); } - - // Check file extension - std::string urlString = url.path().toStdString(); - std::size_t extensionSeparator = urlString.rfind('.'); - if (extensionSeparator != std::string::npos) { - std::string detectedExtension = urlString.substr(extensionSeparator + 1); - for (auto& supportedFormat : supportedFormats) { - for (auto& extension : supportedFormat.mimeType.extensions) { - if (extension == detectedExtension) { - return supportedFormat.loader(data, mapping, url); - } - } - } - } - - // Check web media type - if (webMediaType != "") { - for (auto& supportedFormat : supportedFormats) { - for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { - if (candidateWebMediaType == webMediaType) { - return supportedFormat.loader(data, mapping, url); - } - } - } - } - - // Supported file type not found. Abort loading. - return hfm::Model::Pointer(); + return factory->get()->read(data, mapping, url); } diff --git a/libraries/model-networking/src/model-networking/ModelLoader.h b/libraries/model-networking/src/model-networking/ModelLoader.h index 0deb339f15..5fbab4fb65 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.h +++ b/libraries/model-networking/src/model-networking/ModelLoader.h @@ -12,82 +12,15 @@ #ifndef hifi_ModelLoader_h #define hifi_ModelLoader_h -#include -#include -#include - #include #include -#include class ModelLoader { public: - - // A short sequence of bytes, typically at the beginning of the file, which identifies the file format - class FileSignature { - public: - FileSignature(const std::string& bytes, int byteOffset) : - bytes(bytes), - byteOffset(byteOffset) { - } - - std::string bytes; - int byteOffset; - }; - - // A named file extension with a list of known ways to positively identify the file type - class MIMEType { - public: - MIMEType(const std::string& name) : - name(name) { - } - - std::string name; - std::vector extensions; - std::vector webMediaTypes; - std::vector fileSignatures; - }; - - ModelLoader(); - - // T is a subclass of hfm::Serializer - template - void addSupportedFormat(const MIMEType& mimeType) { - supportedFormats.push_back(SupportedFormat(mimeType, SupportedFormat::getLoader())); - } - // Given the currently stored list of supported file formats, determine how to load a model from the given parameters. // If successful, return an owned reference to the newly loaded model. // If failed, return an empty reference. hfm::Model::Pointer load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; - -protected: - using Loader = std::function; - - class SupportedFormat { - public: - SupportedFormat(const MIMEType& mimeType, const Loader& loader) : - mimeType(mimeType), - loader(loader) { - } - - MIMEType mimeType; - Loader loader; - - template - static Loader getLoader() { - assert([](){ - T t; - return dynamic_cast(&t) != nullptr; - }()); - - return [](const hifi::ByteArray& bytes, const hifi::VariantHash& mapping, const hifi::URL& url) -> hfm::Model::Pointer { - return T().read(bytes, mapping, url); - }; - } - }; - - std::vector supportedFormats; }; #endif // hifi_ModelLoader_h From 6491ea23eb327cf83e217a02dbc78d3251e66451 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 30 Nov 2018 18:54:33 -0800 Subject: [PATCH 18/70] Removed unneeded sort order and renamed folder. --- tools/nitpick/src/AWSInterface.cpp | 40 ++++++++++++------------- tools/nitpick/src/AWSInterface.h | 4 +-- tools/nitpick/src/Test.cpp | 18 +++++------ tools/nitpick/src/TestRailInterface.cpp | 4 +-- tools/nitpick/src/TestRunner.cpp | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index f525b7e039..21b88277db 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -22,11 +22,11 @@ AWSInterface::AWSInterface(QObject* parent) : QObject(parent) { } void AWSInterface::createWebPageFromResults(const QString& testResults, - const QString& snapshotDirectory, + const QString& workingDirectory, QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) { _testResults = testResults; - _snapshotDirectory = snapshotDirectory; + _workingDirectory = workingDirectory; _urlLineEdit = urlLineEdit; _urlLineEdit->setEnabled(false); @@ -44,13 +44,13 @@ void AWSInterface::extractTestFailuresFromZippedFolder() { // the folder will be called `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]` // and, this folder will be in the working directory QStringList parts =_testResults.split('/'); - QString zipFolderName = _snapshotDirectory + "/" + parts[parts.length() - 1].split('.')[0]; + QString zipFolderName = _workingDirectory + "/" + parts[parts.length() - 1].split('.')[0]; if (QDir(zipFolderName).exists()) { QDir dir = zipFolderName; dir.removeRecursively(); } - JlCompress::extractDir(_testResults, _snapshotDirectory); + JlCompress::extractDir(_testResults, _workingDirectory); } void AWSInterface::createHTMLFile() { @@ -60,7 +60,7 @@ void AWSInterface::createHTMLFile() { QString filename = pathComponents[pathComponents.length() - 1]; _resultsFolder = filename.left(filename.length() - 4); - QString resultsPath = _snapshotDirectory + "/" + _resultsFolder + "/"; + QString resultsPath = _workingDirectory + "/" + _resultsFolder + "/"; QDir().mkdir(resultsPath); _htmlFilename = resultsPath + HTML_FILENAME; @@ -156,7 +156,7 @@ void AWSInterface::writeTable(QTextStream& stream) { // Note that failures are processed first, then successes QStringList originalNamesFailures; QStringList originalNamesSuccesses; - QDirIterator it1(QDir(_snapshotDirectory, "", QDir::Name)); + QDirIterator it1(_workingDirectory); while (it1.hasNext()) { QString nextDirectory = it1.next(); @@ -190,10 +190,10 @@ void AWSInterface::writeTable(QTextStream& stream) { newNamesSuccesses.append(originalNamesSuccesses[i].split("--tests.")[1]); } - _htmlFailuresFolder = _snapshotDirectory + "/" + _resultsFolder + "/" + FAILURES_FOLDER; + _htmlFailuresFolder = _workingDirectory + "/" + _resultsFolder + "/" + FAILURES_FOLDER; QDir().mkdir(_htmlFailuresFolder); - _htmlSuccessesFolder = _snapshotDirectory + "/" + _resultsFolder + "/" + SUCCESSES_FOLDER; + _htmlSuccessesFolder = _workingDirectory + "/" + _resultsFolder + "/" + SUCCESSES_FOLDER; QDir().mkdir(_htmlSuccessesFolder); for (int i = 0; i < newNamesFailures.length(); ++i) { @@ -204,7 +204,7 @@ void AWSInterface::writeTable(QTextStream& stream) { QDir().rename(originalNamesSuccesses[i], _htmlSuccessesFolder + "/" + newNamesSuccesses[i]); } - QDirIterator it2(QDir(_htmlFailuresFolder, "", QDir::Name)); + QDirIterator it2(_htmlFailuresFolder); while (it2.hasNext()) { QString nextDirectory = it2.next(); @@ -239,7 +239,7 @@ void AWSInterface::writeTable(QTextStream& stream) { stream << "\t" << "\t" << "\n"; stream << "\t" << "\t" << "

The following tests passed:

"; - QDirIterator it3(QDir(_htmlSuccessesFolder, "", QDir::Name)); + QDirIterator it3(_htmlSuccessesFolder); while (it3.hasNext()) { QString nextDirectory = it3.next(); @@ -320,7 +320,7 @@ void AWSInterface::createEntry(int index, const QString& testResult, QTextStream } void AWSInterface::updateAWS() { - QString filename = _snapshotDirectory + "/updateAWS.py"; + QString filename = _workingDirectory + "/updateAWS.py"; if (QFile::exists(filename)) { QFile::remove(filename); } @@ -337,7 +337,7 @@ void AWSInterface::updateAWS() { stream << "import boto3\n"; stream << "s3 = boto3.resource('s3')\n\n"; - QDirIterator it1(QDir(_htmlFailuresFolder, "", QDir::Name)); + QDirIterator it1(_htmlFailuresFolder); while (it1.hasNext()) { QString nextDirectory = it1.next(); @@ -351,20 +351,20 @@ void AWSInterface::updateAWS() { QStringList parts = nextDirectory.split('/'); QString filename = parts[parts.length() - 3] + "/" + parts[parts.length() - 2] + "/" + parts[parts.length() - 1]; - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Actual Image.png" << "', 'rb')\n"; stream << "s3.Bucket('hifi-content').put_object(Bucket='" << AWS_BUCKET << "', Key='" << filename << "/" << "Actual Image.png" << "', Body=data)\n\n"; - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Expected Image.png" << "', 'rb')\n"; stream << "s3.Bucket('hifi-content').put_object(Bucket='" << AWS_BUCKET << "', Key='" << filename << "/" << "Expected Image.png" << "', Body=data)\n\n"; if (QFile::exists(_htmlFailuresFolder + "/" + parts[parts.length() - 1] + "/Difference Image.png")) { - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Difference Image.png" << "', 'rb')\n"; @@ -372,7 +372,7 @@ void AWSInterface::updateAWS() { } } - QDirIterator it2(QDir(_htmlSuccessesFolder, "", QDir::Name)); + QDirIterator it2(_htmlSuccessesFolder); while (it2.hasNext()) { QString nextDirectory = it2.next(); @@ -386,20 +386,20 @@ void AWSInterface::updateAWS() { QStringList parts = nextDirectory.split('/'); QString filename = parts[parts.length() - 3] + "/" + parts[parts.length() - 2] + "/" + parts[parts.length() - 1]; - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Actual Image.png" << "', 'rb')\n"; stream << "s3.Bucket('hifi-content').put_object(Bucket='" << AWS_BUCKET << "', Key='" << filename << "/" << "Actual Image.png" << "', Body=data)\n\n"; - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Expected Image.png" << "', 'rb')\n"; stream << "s3.Bucket('hifi-content').put_object(Bucket='" << AWS_BUCKET << "', Key='" << filename << "/" << "Expected Image.png" << "', Body=data)\n\n"; if (QFile::exists(_htmlSuccessesFolder + "/" + parts[parts.length() - 1] + "/Difference Image.png")) { - stream << "data = open('" << _snapshotDirectory << "/" << filename << "/" + stream << "data = open('" << _workingDirectory << "/" << filename << "/" << "Difference Image.png" << "', 'rb')\n"; @@ -407,7 +407,7 @@ void AWSInterface::updateAWS() { } } - stream << "data = open('" << _snapshotDirectory << "/" << _resultsFolder << "/" << HTML_FILENAME << "', 'rb')\n"; + stream << "data = open('" << _workingDirectory << "/" << _resultsFolder << "/" << HTML_FILENAME << "', 'rb')\n"; stream << "s3.Bucket('hifi-content').put_object(Bucket='" << AWS_BUCKET << "', Key='" << _resultsFolder << "/" << HTML_FILENAME << "', Body=data, ContentType='text/html')\n"; diff --git a/tools/nitpick/src/AWSInterface.h b/tools/nitpick/src/AWSInterface.h index f4084f1a14..c5be5f35bb 100644 --- a/tools/nitpick/src/AWSInterface.h +++ b/tools/nitpick/src/AWSInterface.h @@ -26,7 +26,7 @@ public: explicit AWSInterface(QObject* parent = 0); void createWebPageFromResults(const QString& testResults, - const QString& snapshotDirectory, + const QString& workingDirectory, QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit); @@ -49,7 +49,7 @@ public: private: QString _testResults; - QString _snapshotDirectory; + QString _workingDirectory; QString _resultsFolder; QString _htmlFailuresFolder; QString _htmlSuccessesFolder; diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index 976add4200..4ae2f7ef9d 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -542,7 +542,7 @@ void Test::createAllMDFiles() { createMDFile(_testsRootDirectory); } - QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it(_testsRootDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -636,7 +636,7 @@ void Test::createAllTestAutoScripts() { createTestAutoScript(_testsRootDirectory); } - QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it(_testsRootDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -704,7 +704,7 @@ void Test::createAllRecursiveScripts() { createRecursiveScript(_testsRootDirectory, false); - QDirIterator it(QDir(_testsRootDirectory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it(_testsRootDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -716,7 +716,7 @@ void Test::createAllRecursiveScripts() { // Only process directories that have sub-directories bool hasNoSubDirectories{ true }; - QDirIterator it2(QDir(directory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it2(directory, QDirIterator::Subdirectories); while (it2.hasNext()) { QString directory2 = it2.next(); @@ -787,7 +787,7 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact testFound = true; } - QDirIterator it(QDir(topLevelDirectory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it(topLevelDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -858,7 +858,7 @@ void Test::createTestsOutline() { int rootDepth { _testDirectory.count('/') }; // Each test is shown as the folder name linking to the matching GitHub URL, and the path to the associated test.md file - QDirIterator it(QDir(_testDirectory, "", QDir::Name), QDirIterator::Subdirectories); + QDirIterator it(_testDirectory, QDirIterator::Subdirectories); while (it.hasNext()) { QString directory = it.next(); @@ -1052,11 +1052,11 @@ void Test::createWebPage(QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) { return; } - QString snapshotDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select a folder to store temporary files in", + QString workingDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select a folder to store temporary files in", nullptr, QFileDialog::ShowDirsOnly); - if (snapshotDirectory.isNull()) { + if (workingDirectory.isNull()) { return; } - _awsInterface.createWebPageFromResults(testResults, snapshotDirectory, updateAWSCheckBox, urlLineEdit); + _awsInterface.createWebPageFromResults(testResults, workingDirectory, updateAWSCheckBox, urlLineEdit); } \ No newline at end of file diff --git a/tools/nitpick/src/TestRailInterface.cpp b/tools/nitpick/src/TestRailInterface.cpp index f2e895d17e..1d7aa0a32f 100644 --- a/tools/nitpick/src/TestRailInterface.cpp +++ b/tools/nitpick/src/TestRailInterface.cpp @@ -275,7 +275,7 @@ void TestRailInterface::processDirectoryPython(const QString& directory, const QString& userGitHub, const QString& branchGitHub) { // Loop over all entries in directory - QDirIterator it(QDir(directory, "", QDir::Name)); + QDirIterator it(directory); while (it.hasNext()) { QString nextDirectory = it.next(); @@ -855,7 +855,7 @@ QDomElement TestRailInterface::processDirectoryXML(const QString& directory, QDomElement result = element; // Loop over all entries in directory - QDirIterator it(QDir(directory, "", QDir::Name)); + QDirIterator it(directory); while (it.hasNext()) { QString nextDirectory = it.next(); diff --git a/tools/nitpick/src/TestRunner.cpp b/tools/nitpick/src/TestRunner.cpp index d3c05483f9..9b99e114a7 100644 --- a/tools/nitpick/src/TestRunner.cpp +++ b/tools/nitpick/src/TestRunner.cpp @@ -366,7 +366,7 @@ void TestRunner::createSnapshotFolder() { // Note that we cannot use just a `png` filter, as the filenames include periods // Also, delete any `jpg` and `txt` files // The idea is to leave only previous zipped result folders - QDirIterator it(QDir(_snapshotFolder, "", QDir::Name)); + QDirIterator it(_snapshotFolder); while (it.hasNext()) { QString filename = it.next(); if (filename.right(4) == ".png" || filename.right(4) == ".jpg" || filename.right(4) == ".txt") { From ad42f6a590907a6e59cc55210fee0ffa56de56c2 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Sat, 1 Dec 2018 12:32:29 -0700 Subject: [PATCH 19/70] Add method to check entities joint hierarchy --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 8 ++++++++ .../entities-renderer/src/RenderableModelEntityItem.h | 1 + libraries/entities/src/EntityItem.h | 1 + libraries/entities/src/EntityScriptingInterface.cpp | 9 +++++++++ libraries/entities/src/EntityScriptingInterface.h | 2 +- libraries/shared/src/SpatiallyNestable.h | 2 ++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index f60bf20e3d..5ed45aa1e7 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -774,6 +774,14 @@ bool RenderableModelEntityItem::shouldBePhysical() const { } } +int RenderableModelEntityItem::getJointParent(int index) const { + auto model = getModel(); + if (model) { + return model->getRig().getJointParentIndex(index); + } + return -1; +} + glm::quat RenderableModelEntityItem::getAbsoluteJointRotationInObjectFrame(int index) const { auto model = getModel(); if (model) { diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 79e56d7a76..ba185dee96 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -94,6 +94,7 @@ public: // these are in the frame of this object (model space) virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override; virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override; + virtual int getJointParent(int index) const override; virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) override; virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index c49017b2e0..954a2740ac 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -455,6 +455,7 @@ public: // these are in the frame of this object virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override { return glm::quat(); } virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override { return glm::vec3(0.0f); } + virtual int getJointParent(int index) const override { return -1; } virtual bool setLocalJointRotation(int index, const glm::quat& rotation) override { return false; } virtual bool setLocalJointTranslation(int index, const glm::vec3& translation) override { return false; } diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3491688588..aae03789e0 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1806,6 +1806,15 @@ glm::vec3 EntityScriptingInterface::localCoordsToVoxelCoords(const QUuid& entity } } +int EntityScriptingInterface::getJointParent(const QUuid& entityID, int index) { + if (auto entity = checkForTreeEntityAndTypeMatch(entityID, EntityTypes::Model)) { + auto modelEntity = std::dynamic_pointer_cast(entity); + return modelEntity->getJointParent(index); + } else { + return -1; + } +} + glm::vec3 EntityScriptingInterface::getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex) { if (auto entity = checkForTreeEntityAndTypeMatch(entityID, EntityTypes::Model)) { auto modelEntity = std::dynamic_pointer_cast(entity); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index df7b0df9a1..ad1c11ba41 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -980,7 +980,7 @@ public slots: */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); - + Q_INVOKABLE int getJointParent(const QUuid& entityID, int index); /**jsdoc * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and * orientation. diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 03ed97afbd..f8658f73d4 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -163,6 +163,8 @@ public: virtual glm::vec3 getAbsoluteJointScaleInObjectFrame(int index) const { return glm::vec3(1.0f); } virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const { return glm::quat(); } virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const { return glm::vec3(); } + virtual int getJointParent(int index) const { return -1; } + virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) { return false; } virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) {return false; } From 508a6587523036cef88741605505af9c77a0dd59 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sat, 1 Dec 2018 18:41:44 -0800 Subject: [PATCH 20/70] Filenames are sorted in memory. --- tools/nitpick/src/AWSInterface.cpp | 43 +++++++++++++++++++----------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index 21b88277db..11a0f06d07 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -27,7 +27,7 @@ void AWSInterface::createWebPageFromResults(const QString& testResults, QLineEdit* urlLineEdit) { _testResults = testResults; _workingDirectory = workingDirectory; - + _urlLineEdit = urlLineEdit; _urlLineEdit->setEnabled(false); @@ -43,7 +43,7 @@ void AWSInterface::extractTestFailuresFromZippedFolder() { // For a test results zip file called `D:/tt/TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ].zip` // the folder will be called `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]` // and, this folder will be in the working directory - QStringList parts =_testResults.split('/'); + QStringList parts = _testResults.split('/'); QString zipFolderName = _workingDirectory + "/" + parts[parts.length() - 1].split('.')[0]; if (QDir(zipFolderName).exists()) { QDir dir = zipFolderName; @@ -116,7 +116,7 @@ void AWSInterface::writeTitle(QTextStream& stream) { QString date_buildorPR_hostName = tokens[tokens.length() - 1].split("--")[1].split(".")[0]; QString buildorPR = date_buildorPR_hostName.split('(')[1].split(')')[0]; - QString hostName = date_buildorPR_hostName.split('[')[1].split(']')[0]; + QString hostName = date_buildorPR_hostName.split('[')[1].split(']')[0]; QStringList dateList = date_buildorPR_hostName.split('(')[0].split('_')[0].split('-'); QString year = dateList[0]; @@ -189,7 +189,7 @@ void AWSInterface::writeTable(QTextStream& stream) { for (int i = 0; i < originalNamesSuccesses.length(); ++i) { newNamesSuccesses.append(originalNamesSuccesses[i].split("--tests.")[1]); } - + _htmlFailuresFolder = _workingDirectory + "/" + _resultsFolder + "/" + FAILURES_FOLDER; QDir().mkdir(_htmlFailuresFolder); @@ -204,7 +204,11 @@ void AWSInterface::writeTable(QTextStream& stream) { QDir().rename(originalNamesSuccesses[i], _htmlSuccessesFolder + "/" + newNamesSuccesses[i]); } + // Mac does not read folders in lexicographic order, so this step is divided into 2 + // Each test consists of the test name and its index. QDirIterator it2(_htmlFailuresFolder); + QStringList folderNames; + while (it2.hasNext()) { QString nextDirectory = it2.next(); @@ -214,10 +218,17 @@ void AWSInterface::writeTable(QTextStream& stream) { } QStringList pathComponents = nextDirectory.split('/'); - QString filename = pathComponents[pathComponents.length() - 1]; - int splitIndex = filename.lastIndexOf("."); - QString testName = filename.left(splitIndex).replace(".", " / "); - QString testNumber = filename.right(filename.length() - (splitIndex + 1)); + QString folderName = pathComponents[pathComponents.length() - 1]; + + folderNames << folderName; + } + + folderNames.sort(); + for (const auto& folderName : folderNames) { + int splitIndex = folderName.lastIndexOf("."); + QString testName = folderName.left(splitIndex).replace('.', " / "); + + int testNumber = folderName.right(folderName.length() - (splitIndex + 1)).toInt(); // The failures are ordered lexicographically, so we know that we can rely on the testName changing to create a new table if (testName != previousTestName) { @@ -232,7 +243,7 @@ void AWSInterface::writeTable(QTextStream& stream) { openTable(stream); } - createEntry(testNumber.toInt(), filename, stream, true); + createEntry(testNumber, folderName, stream, true); } closeTable(stream); @@ -290,7 +301,7 @@ void AWSInterface::closeTable(QTextStream& stream) { void AWSInterface::createEntry(int index, const QString& testResult, QTextStream& stream, const bool isFailure) { stream << "\t\t\t\n"; stream << "\t\t\t\t

" << QString::number(index) << "

\n"; - + // For a test named `D:/t/fgadhcUDHSFaidsfh3478JJJFSDFIUSOEIrf/Failure_1--tests.engine.interaction.pick.collision.many.00000` // we need `Failure_1--tests.engine.interaction.pick.collision.many.00000` QStringList resultNameComponents = testResult.split('/'); @@ -302,11 +313,11 @@ void AWSInterface::createEntry(int index, const QString& testResult, QTextStream folder = FAILURES_FOLDER; differenceFileFound = QFile::exists(_htmlFailuresFolder + "/" + resultName + "/Difference Image.png"); } else { - folder = SUCCESSES_FOLDER; + folder = SUCCESSES_FOLDER; differenceFileFound = QFile::exists(_htmlSuccessesFolder + "/" + resultName + "/Difference Image.png"); } - + stream << "\t\t\t\t\n"; stream << "\t\t\t\t\n"; @@ -345,7 +356,7 @@ void AWSInterface::updateAWS() { if (nextDirectory.right(1) == ".") { continue; } - + // nextDirectory looks like `D:/t/TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]/failures/engine.render.effect.bloom.00000` // We need to concatenate the last 3 components, to get `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]/failures/engine.render.effect.bloom.00000` QStringList parts = nextDirectory.split('/'); @@ -426,10 +437,10 @@ void AWSInterface::updateAWS() { [=](int exitCode, QProcess::ExitStatus exitStatus) { _busyWindow.hide(); }); #ifdef Q_OS_WIN - QStringList parameters = QStringList() << filename ; + QStringList parameters = QStringList() << filename; process->start(_pythonCommand, parameters); #elif defined Q_OS_MAC - QStringList parameters = QStringList() << "-c" << _pythonCommand + " " + filename; + QStringList parameters = QStringList() << "-c" << _pythonCommand + " " + filename; process->start("sh", parameters); #endif -} +} \ No newline at end of file From a4689edee11fb6f1265c00cad09be1b7dd417b0a Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sat, 1 Dec 2018 19:03:59 -0800 Subject: [PATCH 21/70] Added messages for completion of HTML creation. --- tools/nitpick/src/AWSInterface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index 11a0f06d07..2e9ba7ad6d 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -36,6 +36,9 @@ void AWSInterface::createWebPageFromResults(const QString& testResults, if (updateAWSCheckBox->isChecked()) { updateAWS(); + QMessageBox::information(0, "Success", "HTML file has been created and copied to AWS"); + } else { + QMessageBox::information(0, "Success", "HTML file has been created"); } } From f153d4fcaeefd245a6bd94886368fd9906024ba3 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sun, 2 Dec 2018 20:13:58 -0800 Subject: [PATCH 22/70] Do not create empty recursive test scripts. --- tools/nitpick/src/Test.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index 4ae2f7ef9d..14d08e9822 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -653,7 +653,7 @@ void Test::createAllTestAutoScripts() { } } - QMessageBox::information(0, "Success", "'nitpick.js' scripts have been created"); + QMessageBox::information(0, "Success", "All 'testAuto.js' scripts have been created"); } bool Test::createTestAutoScript(const QString& directory) { @@ -737,16 +737,17 @@ void Test::createAllRecursiveScripts() { } void Test::createRecursiveScript(const QString& topLevelDirectory, bool interactiveMode) { - const QString recursiveTestsFilename("testRecursive.js"); - QFile allTestsFilename(topLevelDirectory + "/" + recursiveTestsFilename); - if (!allTestsFilename.open(QIODevice::WriteOnly | QIODevice::Text)) { + const QString recursiveTestsScriptName("testRecursive.js"); + const QString recursiveTestsFilename(topLevelDirectory + "/" + recursiveTestsScriptName); + QFile recursiveTestsFile(recursiveTestsFilename); + if (!recursiveTestsFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), - "Failed to create \"" + recursiveTestsFilename + "\" in directory \"" + topLevelDirectory + "\""); + "Failed to create \"" + recursiveTestsScriptName + "\" in directory \"" + topLevelDirectory + "\""); exit(-1); } - QTextStream textStream(&allTestsFilename); + QTextStream textStream(&recursiveTestsFile); textStream << "// This is an automatically generated file, created by nitpick" << endl; @@ -809,7 +810,15 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact if (interactiveMode && !testFound) { QMessageBox::information(0, "Failure", "No \"" + TEST_FILENAME + "\" files found"); - allTestsFilename.close(); + recursiveTestsFile.close(); + return; + } + + // If 'directories' is empty, this means that this recursive script has no tests to call, so it is redundant + // The script will be closed and deleted + if (directories.length() == 0) { + recursiveTestsFile.close(); + QFile::remove(recursiveTestsFilename); return; } @@ -821,7 +830,7 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact textStream << endl; textStream << "nitpick.runRecursive();" << endl; - allTestsFilename.close(); + recursiveTestsFile.close(); } void Test::createTestsOutline() { From 2178baf1a8b0691b8a42683dc43365134b5137f9 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 16:49:28 -0800 Subject: [PATCH 23/70] Create SimpleFormat --- libraries/hfm/src/hfm/HFMSimpleFormat.cpp | 35 +++++++++++++++++ libraries/hfm/src/hfm/HFMSimpleFormat.h | 47 +++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 libraries/hfm/src/hfm/HFMSimpleFormat.cpp create mode 100644 libraries/hfm/src/hfm/HFMSimpleFormat.h diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.cpp b/libraries/hfm/src/hfm/HFMSimpleFormat.cpp new file mode 100644 index 0000000000..2881945400 --- /dev/null +++ b/libraries/hfm/src/hfm/HFMSimpleFormat.cpp @@ -0,0 +1,35 @@ +// +// HFMSimpleFormat.cpp +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "HFMSimpleFormat.h" + +namespace hfm { + template + std::shared_ptr SimpleFactory::get() { + return std::make_shared(); + } + + template + SimpleFormat::SimpleFormat(const MIMEType& mimeType) : Format(), + _mimeType(mimeType) { + } + + template + void SimpleFormat::registerFormat(FormatRegistry& registry) { + _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_shared>()); + } + + template + void SimpleFormat::unregisterFormat(FormatRegistry& registry) { + registry.unregisterMIMEType(_mimeTypeID); + _mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; + } +}; diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.h b/libraries/hfm/src/hfm/HFMSimpleFormat.h new file mode 100644 index 0000000000..c12a7233bf --- /dev/null +++ b/libraries/hfm/src/hfm/HFMSimpleFormat.h @@ -0,0 +1,47 @@ +// +// HFMSimpleFormat.h +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HFMSimpleFormat_h +#define hifi_HFMSimpleFormat_h + +#include "HFMFormat.h" +#include "HFMSerializer.h" + +namespace hfm { + template + class SimpleFactory : public Serializer::Factory { + std::shared_ptr get() override { + return std::make_shared(); + } + }; + + template // T is an implementation of hfm::Serializer + class SimpleFormat : public Format { + public: + SimpleFormat(const MIMEType& mimeType) : Format(), + _mimeType(mimeType) { + } + + void registerFormat(FormatRegistry& registry) override { + _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_unique>()); + } + + void unregisterFormat(FormatRegistry& registry) override { + registry.unregisterMIMEType(_mimeTypeID); + _mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; + } + protected: + MIMEType _mimeType; + hfm::FormatRegistry::MIMETypeID _mimeTypeID; + }; +}; + +#endif // hifi_HFMSimpleFormat_h From 30c4830bd8192582461a68bb0ad6e22b3b4a8fdb Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 17:20:16 -0800 Subject: [PATCH 24/70] Make Serializers use SimpleFormat --- libraries/fbx/src/FBXSerializer.cpp | 14 ++++---------- libraries/fbx/src/FBXSerializer.h | 12 +----------- libraries/fbx/src/GLTFSerializer.cpp | 14 ++++---------- libraries/fbx/src/GLTFSerializer.h | 14 +++----------- libraries/fbx/src/OBJSerializer.cpp | 14 ++++---------- libraries/fbx/src/OBJSerializer.h | 13 ++----------- .../src/model-networking/ModelFormatRegistry.cpp | 6 +++--- 7 files changed, 21 insertions(+), 66 deletions(-) diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index dc39143f6b..b57ff183a0 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -33,6 +33,7 @@ #include #include +#include #include // TOOL: Uncomment the following line to enable the filtering of all the unkwnon fields of a node so we can break point easily while loading a model with problems... @@ -1833,21 +1834,14 @@ HFMModel* FBXSerializer::extractHFMModel(const QVariantHash& mapping, const QStr return hfmModelPtr; } -void FBXFormat::registerFormat(hfm::FormatRegistry& registry) { +MIMEType getFBXMIMEType() { MIMEType mimeType("fbx"); mimeType.extensions.push_back("fbx"); mimeType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); - mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); + return mimeType; } -void FBXFormat::unregisterFormat(hfm::FormatRegistry& registry) { - registry.unregisterMIMEType(mimeTypeID); - mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; -} - -std::shared_ptr FBXSerializer::Factory::get() { - return std::make_shared(); -} +std::shared_ptr FBXSerializer::FORMAT = std::make_shared>(getFBXMIMEType()); HFMModel::Pointer FBXSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { QBuffer buffer(const_cast(&data)); diff --git a/libraries/fbx/src/FBXSerializer.h b/libraries/fbx/src/FBXSerializer.h index 231fc5316c..e66a6b911a 100644 --- a/libraries/fbx/src/FBXSerializer.h +++ b/libraries/fbx/src/FBXSerializer.h @@ -95,19 +95,9 @@ public: class ExtractedMesh; -class FBXFormat : public hfm::Format { -public: - virtual void registerFormat(hfm::FormatRegistry& registry) override; - virtual void unregisterFormat(hfm::FormatRegistry& registry) override; -protected: - hfm::FormatRegistry::MIMETypeID mimeTypeID { hfm::FormatRegistry::INVALID_MIME_TYPE_ID }; -}; - class FBXSerializer : public HFMSerializer { public: - class Factory : public HFMSerializer::Factory { - std::shared_ptr get() override; - }; + static std::shared_ptr FORMAT; HFMModel* _hfmModel; /// Reads HFMModel from the supplied model and mapping data. diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index 801adf6bc5..2cad08984f 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -34,6 +34,7 @@ #include #include "FBXSerializer.h" +#include GLTFSerializer::GLTFSerializer() { @@ -910,21 +911,14 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const QUrl& url) { return true; } -void GLTFFormat::registerFormat(hfm::FormatRegistry& registry) { +MIMEType getGLTFMIMEType() { MIMEType mimeType("gltf"); mimeType.extensions.push_back("gltf"); mimeType.webMediaTypes.push_back("model/gltf+json"); - mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); + return mimeType; } -void GLTFFormat::unregisterFormat(hfm::FormatRegistry& registry) { - registry.unregisterMIMEType(mimeTypeID); - mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; -} - -std::shared_ptr GLTFSerializer::Factory::get() { - return std::make_shared(); -} +std::shared_ptr GLTFSerializer::FORMAT = std::make_shared>(getGLTFMIMEType()); HFMModel::Pointer GLTFSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index 154ba08e9d..626e6c0995 100644 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -701,21 +701,13 @@ struct GLTFFile { } }; -class GLTFFormat : public hfm::Format { -public: - virtual void registerFormat(hfm::FormatRegistry& registry) override; - virtual void unregisterFormat(hfm::FormatRegistry& registry) override; -protected: - hfm::FormatRegistry::MIMETypeID mimeTypeID; -}; - class GLTFSerializer : public QObject, public HFMSerializer { Q_OBJECT public: - class Factory : public HFMSerializer::Factory { - std::shared_ptr get() override; - }; GLTFSerializer(); + + static std::shared_ptr FORMAT; + HFMModel::Pointer read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url = QUrl()) override; private: GLTFFile _file; diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/fbx/src/OBJSerializer.cpp index ae279bf0a7..62b33e3690 100644 --- a/libraries/fbx/src/OBJSerializer.cpp +++ b/libraries/fbx/src/OBJSerializer.cpp @@ -28,6 +28,7 @@ #include #include "FBXSerializer.h" +#include #include #include @@ -651,20 +652,13 @@ done: return result; } -void OBJFormat::registerFormat(hfm::FormatRegistry& registry) { +MIMEType getOBJMIMEType() { MIMEType mimeType("obj"); mimeType.extensions.push_back("obj"); - mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); + return mimeType; } -void OBJFormat::unregisterFormat(hfm::FormatRegistry& registry) { - registry.unregisterMIMEType(mimeTypeID); - mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; -} - -std::shared_ptr OBJSerializer::Factory::get() { - return std::make_shared(); -} +std::shared_ptr OBJSerializer::FORMAT = std::make_shared>(getOBJMIMEType()); HFMModel::Pointer OBJSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { PROFILE_RANGE_EX(resource_parse, __FUNCTION__, 0xffff0000, nullptr); diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/fbx/src/OBJSerializer.h index 0a3f4c93ac..cbf6ee3ce2 100644 --- a/libraries/fbx/src/OBJSerializer.h +++ b/libraries/fbx/src/OBJSerializer.h @@ -90,20 +90,11 @@ public: OBJMaterial() : shininess(0.0f), opacity(1.0f), diffuseColor(0.9f), specularColor(0.9f), emissiveColor(0.0f), illuminationModel(-1) {} }; -class OBJFormat : public hfm::Format { -public: - virtual void registerFormat(hfm::FormatRegistry& registry) override; - virtual void unregisterFormat(hfm::FormatRegistry& registry) override; -protected: - hfm::FormatRegistry::MIMETypeID mimeTypeID; -}; - class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can make network requests. Q_OBJECT public: - class Factory : public HFMSerializer::Factory { - std::shared_ptr get() override; - }; + static std::shared_ptr FORMAT; + typedef QVector FaceGroup; QVector vertices; QVector vertexColors; diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp index 26f5b66b48..ccc89eb402 100644 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp @@ -20,9 +20,9 @@ ModelFormatRegistry::ModelFormatRegistry() : hfm::FormatRegistry() { } void ModelFormatRegistry::addDefaultFormats() { - addFormat(std::make_shared()); - addFormat(std::make_shared()); - addFormat(std::make_shared()); + addFormat(FBXSerializer::FORMAT); + addFormat(OBJSerializer::FORMAT); + addFormat(GLTFSerializer::FORMAT); } void ModelFormatRegistry::addFormat(const std::shared_ptr& format) { From bf1c5f2fa5b1d1e78531279e08c1e6eb00a2fef5 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 10:48:50 -0800 Subject: [PATCH 25/70] Make Serializer::Factory stored by HFMFormatRegistry unique_ptr --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 14 +++++++------- libraries/hfm/src/hfm/HFMFormatRegistry.h | 12 ++++++------ libraries/hfm/src/hfm/HFMSimpleFormat.cpp | 2 +- .../src/model-networking/ModelLoader.cpp | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 08f13c414a..1be05e99d9 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -13,7 +13,7 @@ namespace hfm { -FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, const std::shared_ptr& supportedFactory) { +FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory) { MIMETypeID id = _mimeTypeLibrary.registerMIMEType(mimeType); withWriteLock([&](){ _supportedFormats.emplace_back(id, supportedFactory); @@ -33,20 +33,20 @@ void FormatRegistry::unregisterMIMEType(const MIMETypeID& mimeTypeID) { _mimeTypeLibrary.unregisterMIMEType(mimeTypeID); } -std::shared_ptr FormatRegistry::getFactoryForMIMETypeID(FormatRegistry::MIMETypeID mimeTypeID) const { - return resultWithReadLock>([&](){ +std::shared_ptr FormatRegistry::getSerializerForMIMETypeID(FormatRegistry::MIMETypeID mimeTypeID) const { + return resultWithReadLock>([&](){ for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { if ((*it).mimeTypeID == mimeTypeID) { - return (*it).factory; + return (*it).factory->get(); } } - return std::shared_ptr(); + return std::shared_ptr(); }); } -std::shared_ptr FormatRegistry::getFactoryForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { +std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { MIMETypeID id = _mimeTypeLibrary.findMatchingMIMEType(data, mapping, url, webMediaType); - return getFactoryForMIMETypeID(id); + return getSerializerForMIMETypeID(id); } }; diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index e807d98c46..6e0bd5c66c 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -23,22 +23,22 @@ public: using MIMETypeID = MIMETypeLibrary::ID; static const MIMETypeID INVALID_MIME_TYPE_ID { MIMETypeLibrary::INVALID_ID }; - MIMETypeID registerMIMEType(const MIMEType& mimeType, const std::shared_ptr& supportedFactory); + MIMETypeID registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory); void unregisterMIMEType(const MIMETypeID& id); - std::shared_ptr getFactoryForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; - std::shared_ptr getFactoryForMIMETypeID(MIMETypeID id) const; + std::shared_ptr getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + std::shared_ptr getSerializerForMIMETypeID(MIMETypeID id) const; protected: MIMETypeLibrary _mimeTypeLibrary; class SupportedFormat { public: - SupportedFormat(const MIMETypeID& mimeTypeID, const std::shared_ptr& factory) : + SupportedFormat(const MIMETypeID& mimeTypeID, std::unique_ptr& factory) : mimeTypeID(mimeTypeID), - factory(factory) { + factory(std::move(factory)) { } MIMETypeID mimeTypeID; - std::shared_ptr factory; + std::unique_ptr factory; }; std::vector _supportedFormats; }; diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.cpp b/libraries/hfm/src/hfm/HFMSimpleFormat.cpp index 2881945400..0388268de8 100644 --- a/libraries/hfm/src/hfm/HFMSimpleFormat.cpp +++ b/libraries/hfm/src/hfm/HFMSimpleFormat.cpp @@ -24,7 +24,7 @@ namespace hfm { template void SimpleFormat::registerFormat(FormatRegistry& registry) { - _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_shared>()); + _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_unique>()); } template diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index ff32c3a999..51d2c96ee3 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -16,9 +16,9 @@ hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - auto factory = DependencyManager::get()->getFactoryForMIMEType(data, mapping, url, webMediaType); - if (!factory) { + auto serializer = DependencyManager::get()->getSerializerForMIMEType(data, mapping, url, webMediaType); + if (!serializer) { return hfm::Model::Pointer(); } - return factory->get()->read(data, mapping, url); + return serializer->read(data, mapping, url); } From 6ec0e42ded733c1d98267fde56b5f725005f43d3 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 11:04:29 -0800 Subject: [PATCH 26/70] Remove locks from MIMETypeLibrary --- .../shared/src/shared/MIMETypeLibrary.cpp | 91 +++++++++---------- libraries/shared/src/shared/MIMETypeLibrary.h | 4 +- 2 files changed, 42 insertions(+), 53 deletions(-) diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MIMETypeLibrary.cpp index 4f12f373fe..3532876b67 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.cpp +++ b/libraries/shared/src/shared/MIMETypeLibrary.cpp @@ -12,74 +12,65 @@ #include "MIMETypeLibrary.h" MIMETypeLibrary::ID MIMETypeLibrary::registerMIMEType(const MIMEType& mimeType) { - ID id; - withWriteLock([&](){ - id = nextID++; - _mimeTypes.emplace_back(id, mimeType); - }); + ID id = nextID++; + _mimeTypes.emplace_back(id, mimeType); return id; } void MIMETypeLibrary::unregisterMIMEType(const MIMETypeLibrary::ID& id) { - withWriteLock([&](){ - for (auto it = _mimeTypes.begin(); it != _mimeTypes.end(); it++) { - if ((*it).id == id) { - _mimeTypes.erase(it); - break; - } + for (auto it = _mimeTypes.begin(); it != _mimeTypes.end(); it++) { + if ((*it).id == id) { + _mimeTypes.erase(it); + break; } - }); + } } MIMEType MIMETypeLibrary::getMIMEType(const MIMETypeLibrary::ID& id) const { - return resultWithReadLock([&](){ - for (auto& supportedFormat : _mimeTypes) { - if (supportedFormat.id == id) { - return supportedFormat.mimeType; - } + for (auto& supportedFormat : _mimeTypes) { + if (supportedFormat.id == id) { + return supportedFormat.mimeType; } - return MIMEType::NONE; - }); + } + return MIMEType::NONE; } MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - return resultWithReadLock([&](){ - // Check file contents - for (auto& mimeType : _mimeTypes) { - for (auto& fileSignature : mimeType.mimeType.fileSignatures) { - auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); - if (testBytes == fileSignature.bytes) { - return mimeType.id; + // Check file contents + for (auto& mimeType : _mimeTypes) { + for (auto& fileSignature : mimeType.mimeType.fileSignatures) { + auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); + if (testBytes == fileSignature.bytes) { + return mimeType.id; + } + } + } + + // Check file extension + std::string urlString = url.path().toStdString(); + std::size_t extensionSeparator = urlString.rfind('.'); + if (extensionSeparator != std::string::npos) { + std::string detectedExtension = urlString.substr(extensionSeparator + 1); + for (auto& supportedFormat : _mimeTypes) { + for (auto& extension : supportedFormat.mimeType.extensions) { + if (extension == detectedExtension) { + return supportedFormat.id; } } } + } - // Check file extension - std::string urlString = url.path().toStdString(); - std::size_t extensionSeparator = urlString.rfind('.'); - if (extensionSeparator != std::string::npos) { - std::string detectedExtension = urlString.substr(extensionSeparator + 1); - for (auto& supportedFormat : _mimeTypes) { - for (auto& extension : supportedFormat.mimeType.extensions) { - if (extension == detectedExtension) { - return supportedFormat.id; - } + // Check web media type + if (webMediaType != "") { + for (auto& supportedFormat : _mimeTypes) { + for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { + if (candidateWebMediaType == webMediaType) { + return supportedFormat.id; } } } + } - // Check web media type - if (webMediaType != "") { - for (auto& supportedFormat : _mimeTypes) { - for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { - if (candidateWebMediaType == webMediaType) { - return supportedFormat.id; - } - } - } - } - - // Supported file type not found. - return INVALID_ID; - }); + // Supported file type not found. + return INVALID_ID; } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MIMETypeLibrary.h index 62bc28cdad..354192dd48 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.h +++ b/libraries/shared/src/shared/MIMETypeLibrary.h @@ -19,8 +19,6 @@ #include "HifiTypes.h" -#include "ReadWriteLockable.h" - // A short sequence of bytes, typically at the beginning of the file, which identifies the file format class FileSignature { public: @@ -61,7 +59,7 @@ public: MIMEType MIMEType::NONE = MIMEType(""); -class MIMETypeLibrary : ReadWriteLockable { +class MIMETypeLibrary { public: using ID = unsigned int; static const ID INVALID_ID { 0 }; From 0da4669370ac272f87777617f7cb8310b1b0e4a0 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 11:24:31 -0800 Subject: [PATCH 27/70] Replace ReadWriteLockable with std::lock_guard in HFMFormatRegistry/ModelFormatRegistry --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 42 +++++++++++-------- libraries/hfm/src/hfm/HFMFormatRegistry.h | 3 +- .../model-networking/ModelFormatRegistry.cpp | 5 ++- .../model-networking/ModelFormatRegistry.h | 1 + 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 1be05e99d9..2a537af151 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -14,38 +14,44 @@ namespace hfm { FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory) { + std::lock_guard lock(_libraryLock); + MIMETypeID id = _mimeTypeLibrary.registerMIMEType(mimeType); - withWriteLock([&](){ - _supportedFormats.emplace_back(id, supportedFactory); - }); + _supportedFormats.emplace_back(id, supportedFactory); return id; } void FormatRegistry::unregisterMIMEType(const MIMETypeID& mimeTypeID) { - withWriteLock([&](){ - for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { - if ((*it).mimeTypeID == mimeTypeID) { - _supportedFormats.erase(it); - break; - } + std::lock_guard lock(_libraryLock); + + for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { + if ((*it).mimeTypeID == mimeTypeID) { + _supportedFormats.erase(it); + break; } - }); + } _mimeTypeLibrary.unregisterMIMEType(mimeTypeID); } std::shared_ptr FormatRegistry::getSerializerForMIMETypeID(FormatRegistry::MIMETypeID mimeTypeID) const { - return resultWithReadLock>([&](){ - for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { - if ((*it).mimeTypeID == mimeTypeID) { - return (*it).factory->get(); - } + // TODO: shared_lock in C++14 + std::lock_guard lock(*const_cast(&_libraryLock)); + + for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { + if ((*it).mimeTypeID == mimeTypeID) { + return (*it).factory->get(); } - return std::shared_ptr(); - }); + } + return std::shared_ptr(); } std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - MIMETypeID id = _mimeTypeLibrary.findMatchingMIMEType(data, mapping, url, webMediaType); + MIMETypeID id; + { + // TODO: shared_lock in C++14 + std::lock_guard lock(*const_cast(&_libraryLock)); + id = _mimeTypeLibrary.findMatchingMIMEType(data, mapping, url, webMediaType); + } return getSerializerForMIMETypeID(id); } diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index 6e0bd5c66c..6a16dce0b9 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -18,7 +18,7 @@ namespace hfm { -class FormatRegistry : public ReadWriteLockable { +class FormatRegistry { public: using MIMETypeID = MIMETypeLibrary::ID; static const MIMETypeID INVALID_MIME_TYPE_ID { MIMETypeLibrary::INVALID_ID }; @@ -31,6 +31,7 @@ public: protected: MIMETypeLibrary _mimeTypeLibrary; + std::mutex _libraryLock; class SupportedFormat { public: SupportedFormat(const MIMETypeID& mimeTypeID, std::unique_ptr& factory) : diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp index ccc89eb402..8adc4ea5d9 100644 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp @@ -27,9 +27,10 @@ void ModelFormatRegistry::addDefaultFormats() { void ModelFormatRegistry::addFormat(const std::shared_ptr& format) { format->registerFormat(*this); - withWriteLock([&](){ + { + std::lock_guard lock(_formatsLock); formats.push_back(format); - }); + } } ModelFormatRegistry::~ModelFormatRegistry() { diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h index becc53fc1b..c88873eaca 100644 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h @@ -24,6 +24,7 @@ public: protected: void addDefaultFormats(); std::vector> formats; + std::mutex _formatsLock; }; #endif // hifi_ModelFormatRegistry_h From 660d8c4e92633afb5596ef469c17af806bcc0183 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 11:30:29 -0800 Subject: [PATCH 28/70] Remove unused mapping parameter from MIME type detection --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 4 ++-- libraries/hfm/src/hfm/HFMFormatRegistry.h | 2 +- .../model-networking/src/model-networking/ModelLoader.cpp | 2 +- libraries/shared/src/shared/MIMETypeLibrary.cpp | 2 +- libraries/shared/src/shared/MIMETypeLibrary.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 2a537af151..1125486f5e 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -45,12 +45,12 @@ std::shared_ptr FormatRegistry::getSerializerForMIMETypeID(FormatReg return std::shared_ptr(); } -std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { +std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { MIMETypeID id; { // TODO: shared_lock in C++14 std::lock_guard lock(*const_cast(&_libraryLock)); - id = _mimeTypeLibrary.findMatchingMIMEType(data, mapping, url, webMediaType); + id = _mimeTypeLibrary.findMatchingMIMEType(data, url, webMediaType); } return getSerializerForMIMETypeID(id); } diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index 6a16dce0b9..bf67254c39 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -26,7 +26,7 @@ public: MIMETypeID registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory); void unregisterMIMEType(const MIMETypeID& id); - std::shared_ptr getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + std::shared_ptr getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; std::shared_ptr getSerializerForMIMETypeID(MIMETypeID id) const; protected: diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index 51d2c96ee3..a69559ad38 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -16,7 +16,7 @@ hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - auto serializer = DependencyManager::get()->getSerializerForMIMEType(data, mapping, url, webMediaType); + auto serializer = DependencyManager::get()->getSerializerForMIMEType(data, url, webMediaType); if (!serializer) { return hfm::Model::Pointer(); } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MIMETypeLibrary.cpp index 3532876b67..7bc9defab6 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.cpp +++ b/libraries/shared/src/shared/MIMETypeLibrary.cpp @@ -35,7 +35,7 @@ MIMEType MIMETypeLibrary::getMIMEType(const MIMETypeLibrary::ID& id) const { return MIMEType::NONE; } -MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { +MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { // Check file contents for (auto& mimeType : _mimeTypes) { for (auto& fileSignature : mimeType.mimeType.fileSignatures) { diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MIMETypeLibrary.h index 354192dd48..94dba0b3c8 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.h +++ b/libraries/shared/src/shared/MIMETypeLibrary.h @@ -68,7 +68,7 @@ public: void unregisterMIMEType(const ID& id); MIMEType getMIMEType(const ID& id) const; - ID findMatchingMIMEType(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const; + ID findMatchingMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; protected: ID nextID { 1 }; From 19459c15a54a2eebe7b08895c0e07e5aed5adfa9 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 11:50:50 -0800 Subject: [PATCH 29/70] Split MIMETypeLibrary file type detection into three separate functions --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 9 ++++++++- libraries/shared/src/shared/MIMETypeLibrary.cpp | 11 +++++++++-- libraries/shared/src/shared/MIMETypeLibrary.h | 5 ++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 1125486f5e..b96662bdcc 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -50,7 +50,14 @@ std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi: { // TODO: shared_lock in C++14 std::lock_guard lock(*const_cast(&_libraryLock)); - id = _mimeTypeLibrary.findMatchingMIMEType(data, url, webMediaType); + + id = _mimeTypeLibrary.findMIMETypeForData(data); + if (id == INVALID_MIME_TYPE_ID) { + id = _mimeTypeLibrary.findMIMETypeForURL(url); + } + if (id == INVALID_MIME_TYPE_ID) { + id = _mimeTypeLibrary.findMIMETypeForMediaType(webMediaType); + } } return getSerializerForMIMETypeID(id); } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MIMETypeLibrary.cpp index 7bc9defab6..f3874012b1 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.cpp +++ b/libraries/shared/src/shared/MIMETypeLibrary.cpp @@ -35,7 +35,7 @@ MIMEType MIMETypeLibrary::getMIMEType(const MIMETypeLibrary::ID& id) const { return MIMEType::NONE; } -MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { +MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForData(const hifi::ByteArray& data) const { // Check file contents for (auto& mimeType : _mimeTypes) { for (auto& fileSignature : mimeType.mimeType.fileSignatures) { @@ -46,6 +46,10 @@ MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& } } + return INVALID_ID; +} + +MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForURL(const hifi::URL& url) const { // Check file extension std::string urlString = url.path().toStdString(); std::size_t extensionSeparator = urlString.rfind('.'); @@ -60,6 +64,10 @@ MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& } } + return INVALID_ID; +} + +MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForMediaType(const std::string& webMediaType) const { // Check web media type if (webMediaType != "") { for (auto& supportedFormat : _mimeTypes) { @@ -71,6 +79,5 @@ MIMETypeLibrary::ID MIMETypeLibrary::findMatchingMIMEType(const hifi::ByteArray& } } - // Supported file type not found. return INVALID_ID; } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MIMETypeLibrary.h index 94dba0b3c8..33e415a86c 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.h +++ b/libraries/shared/src/shared/MIMETypeLibrary.h @@ -68,7 +68,10 @@ public: void unregisterMIMEType(const ID& id); MIMEType getMIMEType(const ID& id) const; - ID findMatchingMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; + + ID findMIMETypeForData(const hifi::ByteArray& data) const; + ID findMIMETypeForURL(const hifi::URL& url) const; + ID findMIMETypeForMediaType(const std::string& webMediaType) const; protected: ID nextID { 1 }; From da9f37bb3986e6c8e7332bf5de45dd615957dbc0 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 14:13:33 -0800 Subject: [PATCH 30/70] Fix up HFMFormatRegistry to accept subclass factory unique pointers --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 2 +- libraries/hfm/src/hfm/HFMFormatRegistry.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index b96662bdcc..8ff11d851d 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -13,7 +13,7 @@ namespace hfm { -FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory) { +FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, std::unique_ptr supportedFactory) { std::lock_guard lock(_libraryLock); MIMETypeID id = _mimeTypeLibrary.registerMIMEType(mimeType); diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index bf67254c39..92076e814c 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -23,7 +23,7 @@ public: using MIMETypeID = MIMETypeLibrary::ID; static const MIMETypeID INVALID_MIME_TYPE_ID { MIMETypeLibrary::INVALID_ID }; - MIMETypeID registerMIMEType(const MIMEType& mimeType, std::unique_ptr& supportedFactory); + MIMETypeID registerMIMEType(const MIMEType& mimeType, std::unique_ptr supportedFactory); void unregisterMIMEType(const MIMETypeID& id); std::shared_ptr getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; From a04c822ef0f44acd56dcfefda2c8948d14d64378 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 14:25:55 -0800 Subject: [PATCH 31/70] Oops, ModelFormatRegistry needs to be defined as a Dependency before it can be used by DependencyManager --- .../src/model-networking/ModelFormatRegistry.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h index c88873eaca..88681a01d7 100644 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h @@ -15,7 +15,9 @@ #include #include -class ModelFormatRegistry : public hfm::FormatRegistry { +#include + +class ModelFormatRegistry : public hfm::FormatRegistry, Dependency { public: ModelFormatRegistry(); ~ModelFormatRegistry(); From a63888cac8aa96a90e6d6987b7c6d11fedff4f48 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 14:26:37 -0800 Subject: [PATCH 32/70] Remove unused default constructor for GLTFSerializer --- libraries/fbx/src/GLTFSerializer.cpp | 5 ----- libraries/fbx/src/GLTFSerializer.h | 2 -- 2 files changed, 7 deletions(-) diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index 2cad08984f..b841226a9e 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -36,11 +36,6 @@ #include "FBXSerializer.h" #include - -GLTFSerializer::GLTFSerializer() { - -} - bool GLTFSerializer::getStringVal(const QJsonObject& object, const QString& fieldname, QString& value, QMap& defined) { bool _defined = (object.contains(fieldname) && object[fieldname].isString()); diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index 626e6c0995..fffb192b5b 100644 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -704,8 +704,6 @@ struct GLTFFile { class GLTFSerializer : public QObject, public HFMSerializer { Q_OBJECT public: - GLTFSerializer(); - static std::shared_ptr FORMAT; HFMModel::Pointer read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url = QUrl()) override; From 3c38b43a6516ceef302dfd3bbc6a20b871b3eab6 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 15:26:34 -0800 Subject: [PATCH 33/70] Fix compilation error due to static variable definition in MIMETypeLibrary header file --- libraries/shared/src/shared/MIMETypeLibrary.cpp | 2 ++ libraries/shared/src/shared/MIMETypeLibrary.h | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MIMETypeLibrary.cpp index f3874012b1..5ae4016c54 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.cpp +++ b/libraries/shared/src/shared/MIMETypeLibrary.cpp @@ -11,6 +11,8 @@ #include "MIMETypeLibrary.h" +MIMEType MIMEType::NONE = MIMEType(""); + MIMETypeLibrary::ID MIMETypeLibrary::registerMIMEType(const MIMEType& mimeType) { ID id = nextID++; _mimeTypes.emplace_back(id, mimeType); diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MIMETypeLibrary.h index 33e415a86c..5066e859fb 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.h +++ b/libraries/shared/src/shared/MIMETypeLibrary.h @@ -57,8 +57,6 @@ public: std::vector fileSignatures; }; -MIMEType MIMEType::NONE = MIMEType(""); - class MIMETypeLibrary { public: using ID = unsigned int; From 1c9beed44fb96238bdb2109f31cf0dbdb473cdde Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 3 Dec 2018 15:28:18 -0800 Subject: [PATCH 34/70] Fix ModelFormatRegistry Dependency inheritance being private --- .../model-networking/src/model-networking/ModelFormatRegistry.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h index 88681a01d7..ec1ce79b43 100644 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h +++ b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h @@ -17,7 +17,7 @@ #include -class ModelFormatRegistry : public hfm::FormatRegistry, Dependency { +class ModelFormatRegistry : public hfm::FormatRegistry, public Dependency { public: ModelFormatRegistry(); ~ModelFormatRegistry(); From ed1684967f7bcc41a174f1c338d82833d31facdb Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Tue, 4 Dec 2018 10:07:31 -0800 Subject: [PATCH 35/70] Remove straggler HFMSimpleFormat.cpp --- libraries/hfm/src/hfm/HFMSimpleFormat.cpp | 35 ----------------------- 1 file changed, 35 deletions(-) delete mode 100644 libraries/hfm/src/hfm/HFMSimpleFormat.cpp diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.cpp b/libraries/hfm/src/hfm/HFMSimpleFormat.cpp deleted file mode 100644 index 0388268de8..0000000000 --- a/libraries/hfm/src/hfm/HFMSimpleFormat.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// HFMSimpleFormat.cpp -// libraries/hfm/src/hfm -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "HFMSimpleFormat.h" - -namespace hfm { - template - std::shared_ptr SimpleFactory::get() { - return std::make_shared(); - } - - template - SimpleFormat::SimpleFormat(const MIMEType& mimeType) : Format(), - _mimeType(mimeType) { - } - - template - void SimpleFormat::registerFormat(FormatRegistry& registry) { - _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_unique>()); - } - - template - void SimpleFormat::unregisterFormat(FormatRegistry& registry) { - registry.unregisterMIMEType(_mimeTypeID); - _mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; - } -}; From 15f95aafa52864391d8bc824cc3f622b710188cf Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 4 Dec 2018 16:41:19 -0800 Subject: [PATCH 36/70] WIP. --- tools/nitpick/src/Test.cpp | 50 ++++++++++++++++++++++++++++++++++---- tools/nitpick/src/Test.h | 4 ++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index 14d08e9822..b1254a3c04 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -105,7 +105,7 @@ int Test::compareImageLists() { ++numberOfFailures; if (!isInteractiveMode) { - appendTestResultsToFile(_testResultsFolderPath, testResult, _mismatchWindow.getComparisonImage(), true); + appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), true); } else { _mismatchWindow.exec(); @@ -113,7 +113,7 @@ int Test::compareImageLists() { case USER_RESPONSE_PASS: break; case USE_RESPONSE_FAIL: - appendTestResultsToFile(_testResultsFolderPath, testResult, _mismatchWindow.getComparisonImage(), true); + appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), true); break; case USER_RESPONSE_ABORT: keepOn = false; @@ -124,7 +124,7 @@ int Test::compareImageLists() { } } } else { - appendTestResultsToFile(_testResultsFolderPath, testResult, _mismatchWindow.getComparisonImage(), false); + appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), false); } _progressBar->setValue(i); @@ -134,12 +134,31 @@ int Test::compareImageLists() { return numberOfFailures; } -void Test::appendTestResultsToFile(const QString& _testResultsFolderPath, TestResult testResult, QPixmap comparisonImage, bool hasFailed) { +int Test::checkTextResults() { + // Create lists of failed and passed tests + QStringList nameFilterFailed; + nameFilterFailed << "*.failed.txt"; + QStringList testsFailed = QDir(_snapshotDirectory).entryList(nameFilterFailed, QDir::Files, QDir::Name); + + QStringList nameFilterPassed; + nameFilterPassed << "*.passed.txt"; + QStringList testsPassed = QDir(_snapshotDirectory).entryList(nameFilterPassed, QDir::Files, QDir::Name); + + // Add results to Test Results folder + foreach(QString currentFilename, testsFailed) { + } + + return testsFailed.length(); +} + +void Test::appendTestResultsToFile(TestResult testResult, QPixmap comparisonImage, bool hasFailed) { + // Critical error if Test Results folder does not exist if (!QDir().exists(_testResultsFolderPath)) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Folder " + _testResultsFolderPath + " not found"); exit(-1); } + // There are separate subfolders for failures and passes QString resultFolderPath; if (hasFailed) { resultFolderPath = _testResultsFolderPath + "/Failure_" + QString::number(_failureIndex) + "--" + @@ -195,6 +214,22 @@ void Test::appendTestResultsToFile(const QString& _testResultsFolderPath, TestRe comparisonImage.save(resultFolderPath + "/" + "Difference Image.png"); } +void::Test::appendTestResultsToFile(QString testResultFilename, bool hasFailed) { + QString resultFolderPath; + if (hasFailed) { + resultFolderPath = _testResultsFolderPath + "/Failure_"; + ++_failureIndex; + } else { + resultFolderPath = _testResultsFolderPath + "/Success_"; + ++_successIndex; + } + + if (!QFile::copy(testResultFilename, resultFolderPath)) { +//// QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + sourceFile + " to " + destinationFile); + exit(-1); + } +} + void Test::startTestsEvaluation(const bool isRunningFromCommandLine, const bool isRunningInAutomaticTestRun, const QString& snapshotDirectory, @@ -270,9 +305,14 @@ void Test::startTestsEvaluation(const bool isRunningFromCommandLine, nitpick->downloadFiles(expectedImagesURLs, _snapshotDirectory, _expectedImagesFilenames, (void *)this); } + void Test::finishTestsEvaluation() { + // First - compare the pairs of images int numberOfFailures = compareImageLists(); - + + // Next - check text results + numberOfFailures += checkTextResults(); + if (!_isRunningFromCommandLine && !_isRunningInAutomaticTestRun) { if (numberOfFailures == 0) { QMessageBox::information(0, "Success", "All images are as expected"); diff --git a/tools/nitpick/src/Test.h b/tools/nitpick/src/Test.h index a79252b92a..9ef7c5627a 100644 --- a/tools/nitpick/src/Test.h +++ b/tools/nitpick/src/Test.h @@ -77,6 +77,7 @@ public: void createRecursiveScript(const QString& topLevelDirectory, bool interactiveMode); int compareImageLists(); + int checkTextResults(); QStringList createListOfAll_imagesInDirectory(const QString& imageFormat, const QString& pathToImageDirectory); @@ -84,7 +85,8 @@ public: void includeTest(QTextStream& textStream, const QString& testPathname); - void appendTestResultsToFile(const QString& testResultsFolderPath, TestResult testResult, QPixmap comparisonImage, bool hasFailed); + void appendTestResultsToFile(TestResult testResult, QPixmap comparisonImage, bool hasFailed); + void appendTestResultsToFile(QString testResultFilename, bool hasFailed); bool createTestResultsFolderPath(const QString& directory); QString zipAndDeleteTestResultsFolder(); From f5a19efa8c9cc167f45ad359aef510762962889c Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 5 Dec 2018 11:36:55 -0800 Subject: [PATCH 37/70] Saves text results in zip file. --- tools/nitpick/src/Test.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index b1254a3c04..b2cb77143b 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -146,6 +146,11 @@ int Test::checkTextResults() { // Add results to Test Results folder foreach(QString currentFilename, testsFailed) { + appendTestResultsToFile(currentFilename, true); + } + + foreach(QString currentFilename, testsPassed) { + appendTestResultsToFile(currentFilename, false); } return testsFailed.length(); @@ -215,17 +220,28 @@ void Test::appendTestResultsToFile(TestResult testResult, QPixmap comparisonImag } void::Test::appendTestResultsToFile(QString testResultFilename, bool hasFailed) { + // The test name includes everything until the penultimate period + QString testNameTemp = testResultFilename.left(testResultFilename.lastIndexOf('.')); + QString testName = testResultFilename.left(testNameTemp.lastIndexOf('.')); QString resultFolderPath; if (hasFailed) { - resultFolderPath = _testResultsFolderPath + "/Failure_"; + resultFolderPath = _testResultsFolderPath + "/Failure_" + testName; ++_failureIndex; } else { - resultFolderPath = _testResultsFolderPath + "/Success_"; + resultFolderPath = _testResultsFolderPath + "/Success_" + testName; ++_successIndex; } - if (!QFile::copy(testResultFilename, resultFolderPath)) { -//// QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + sourceFile + " to " + destinationFile); + if (!QDir().mkdir(resultFolderPath)) { + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), + "Failed to create folder " + resultFolderPath); + exit(-1); + } + + QString source = _snapshotDirectory + "/" + testResultFilename; + QString destination = resultFolderPath + "/" + testResultFilename; + if (!QFile::copy(source, destination)) { + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + source + " to " + destination); exit(-1); } } @@ -246,7 +262,7 @@ void Test::startTestsEvaluation(const bool isRunningFromCommandLine, if (!parent.isNull() && parent.right(1) != "/") { parent += "/"; } - _snapshotDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", parent, + _snapshotDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the snapshots", parent, QFileDialog::ShowDirsOnly); // If user canceled then restore previous selection and return @@ -384,7 +400,7 @@ void Test::createTests() { parent += "/"; } - _snapshotDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", parent, + _snapshotDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the snapshots", parent, QFileDialog::ShowDirsOnly); // If user canceled then restore previous selection and return From e3402328c899fe9602db6333b1ed0730bd05b159 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 5 Dec 2018 12:10:28 -0800 Subject: [PATCH 38/70] Use same name for all text results in zipped folder. --- tools/nitpick/src/Test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index b2cb77143b..896b015611 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -225,10 +225,10 @@ void::Test::appendTestResultsToFile(QString testResultFilename, bool hasFailed) QString testName = testResultFilename.left(testNameTemp.lastIndexOf('.')); QString resultFolderPath; if (hasFailed) { - resultFolderPath = _testResultsFolderPath + "/Failure_" + testName; + resultFolderPath = _testResultsFolderPath + "/Failure_" + QString::number(_failureIndex) + "--" + testName; ++_failureIndex; } else { - resultFolderPath = _testResultsFolderPath + "/Success_" + testName; + resultFolderPath = _testResultsFolderPath + "/Success_" + QString::number(_successIndex) + "--" + testName; ++_successIndex; } @@ -239,7 +239,7 @@ void::Test::appendTestResultsToFile(QString testResultFilename, bool hasFailed) } QString source = _snapshotDirectory + "/" + testResultFilename; - QString destination = resultFolderPath + "/" + testResultFilename; + QString destination = resultFolderPath + "/Result.txt"; if (!QFile::copy(source, destination)) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + source + " to " + destination); exit(-1); From 079a623b30ec83454bcc6f0c19dc972e0093c098 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 5 Dec 2018 17:25:03 -0800 Subject: [PATCH 39/70] Added text results to HTML. --- tools/nitpick/src/AWSInterface.cpp | 158 +++++++++++++++++++++++------ tools/nitpick/src/AWSInterface.h | 4 +- 2 files changed, 131 insertions(+), 31 deletions(-) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index 2e9ba7ad6d..034feae7f9 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -10,6 +10,8 @@ #include "AWSInterface.h" #include +#include +#include #include #include @@ -168,7 +170,7 @@ void AWSInterface::writeTable(QTextStream& stream) { continue; } - // Only process failure folders + // Only process result folders if (!nextDirectory.contains("--tests.")) { continue; } @@ -209,9 +211,9 @@ void AWSInterface::writeTable(QTextStream& stream) { // Mac does not read folders in lexicographic order, so this step is divided into 2 // Each test consists of the test name and its index. - QDirIterator it2(_htmlFailuresFolder); QStringList folderNames; + QDirIterator it2(_htmlFailuresFolder); while (it2.hasNext()) { QString nextDirectory = it2.next(); @@ -242,8 +244,7 @@ void AWSInterface::writeTable(QTextStream& stream) { previousTestName = testName; stream << "\t\t

" << testName << "

\n"; - - openTable(stream); + openTable(stream, folderName, true); } createEntry(testNumber, folderName, stream, true); @@ -253,6 +254,9 @@ void AWSInterface::writeTable(QTextStream& stream) { stream << "\t" << "\t" << "\n"; stream << "\t" << "\t" << "

The following tests passed:

"; + // Now do the same for passes + folderNames.clear(); + QDirIterator it3(_htmlSuccessesFolder); while (it3.hasNext()) { QString nextDirectory = it3.next(); @@ -263,10 +267,17 @@ void AWSInterface::writeTable(QTextStream& stream) { } QStringList pathComponents = nextDirectory.split('/'); - QString filename = pathComponents[pathComponents.length() - 1]; - int splitIndex = filename.lastIndexOf("."); - QString testName = filename.left(splitIndex).replace(".", " / "); - QString testNumber = filename.right(filename.length() - (splitIndex + 1)); + QString folderName = pathComponents[pathComponents.length() - 1]; + + folderNames << folderName; + } + + folderNames.sort(); + for (const auto& folderName : folderNames) { + int splitIndex = folderName.lastIndexOf("."); + QString testName = folderName.left(splitIndex).replace('.', " / "); + + int testNumber = folderName.right(folderName.length() - (splitIndex + 1)).toInt(); // The failures are ordered lexicographically, so we know that we can rely on the testName changing to create a new table if (testName != previousTestName) { @@ -277,39 +288,67 @@ void AWSInterface::writeTable(QTextStream& stream) { previousTestName = testName; stream << "\t\t

" << testName << "

\n"; - - openTable(stream); + openTable(stream, folderName, false); } - createEntry(testNumber.toInt(), filename, stream, false); + createEntry(testNumber, folderName, stream, false); } closeTable(stream); } -void AWSInterface::openTable(QTextStream& stream) { - stream << "\t\t\n"; - stream << "\t\t\t\n"; - stream << "\t\t\t\t\n"; - stream << "\t\t\t\t\n"; - stream << "\t\t\t\t\n"; - stream << "\t\t\t\t\n"; - stream << "\t\t\t\n"; +void AWSInterface::openTable(QTextStream& stream, const QString& testResult, const bool isFailure) { + QStringList resultNameComponents = testResult.split('/'); + QString resultName = resultNameComponents[resultNameComponents.length() - 1]; + + bool textResultsFileFound; + if (isFailure) { + textResultsFileFound = QFile::exists(_htmlFailuresFolder + "/" + resultName + "/Result.txt"); + } else { + textResultsFileFound = QFile::exists(_htmlSuccessesFolder + "/" + resultName + "/Result.txt"); + } + + if (textResultsFileFound) { + if (isFailure) { + stream << "\t\t

Test

Actual Image

Expected Image

Difference Image

\n"; + stream << "\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\n"; + } else { + stream << "\t\t

No errors found

\n\n"; + stream << "\t\t

===============

\n\n"; + } + } else { + stream << "\t\t

Element

Actual Value

Expected Value

\n"; + stream << "\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + stream << "\t\t\t\n"; + } } void AWSInterface::closeTable(QTextStream& stream) { stream << "\t\t

Test

Actual Image

Expected Image

Difference Image

\n"; } -void AWSInterface::createEntry(int index, const QString& testResult, QTextStream& stream, const bool isFailure) { - stream << "\t\t\t\n"; - stream << "\t\t\t\t

" << QString::number(index) << "

\n"; - +void AWSInterface::createEntry(const int index, const QString& testResult, QTextStream& stream, const bool isFailure) { // For a test named `D:/t/fgadhcUDHSFaidsfh3478JJJFSDFIUSOEIrf/Failure_1--tests.engine.interaction.pick.collision.many.00000` // we need `Failure_1--tests.engine.interaction.pick.collision.many.00000` QStringList resultNameComponents = testResult.split('/'); QString resultName = resultNameComponents[resultNameComponents.length() - 1]; + QString textResultFilename; + if (isFailure) { + textResultFilename = _htmlFailuresFolder + "/" + resultName + "/Result.txt"; + } else { + textResultFilename = _htmlSuccessesFolder + "/" + resultName + "/Result.txt"; + } + bool textResultsFileFound{ QFile::exists(textResultFilename) }; + QString folder; bool differenceFileFound; if (isFailure) { @@ -320,17 +359,78 @@ void AWSInterface::createEntry(int index, const QString& testResult, QTextStream differenceFileFound = QFile::exists(_htmlSuccessesFolder + "/" + resultName + "/Difference Image.png"); } + if (textResultsFileFound) { + // Parse the JSON file + QFile file; + file.setFileName(textResultFilename); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), + "Failed to open file " + textResultFilename); + } - stream << "\t\t\t\t\n"; - stream << "\t\t\t\t\n"; + QString value = file.readAll(); + file.close(); - if (differenceFileFound) { - stream << "\t\t\t\t\n"; + // The Result.txt file is an object containing elements such as the following: + // "angularDamping": { + // "actual": 0.3938899040222168, + // "expected" : 0.3938899, + // "result" : "pass" + // }, + // + // Failures are thos element that have "fail for the result + + QJsonDocument document = QJsonDocument::fromJson(value.toUtf8()); + QJsonObject json = document.object(); + foreach(const QString& key, json.keys()) { + QJsonValue value = json.value(key); + QJsonObject object = value.toObject(); + + QJsonValue actualValue = object.value("actual"); + QString actualValueString; + if (actualValue.isString()) { + actualValueString = actualValue.toString(); + } else if (actualValue.isBool()) { + actualValueString = actualValue.toBool() ? "true" : "false"; + } else if (actualValue.isDouble()) { + actualValueString = QString::number(actualValue.toDouble()); + } + + QJsonValue expectedValue = object.value("expected"); + QString expectedValueString; + if (expectedValue.isString()) { + expectedValueString = expectedValue.toString(); + } else if (expectedValue.isBool()) { + expectedValueString = expectedValue.toBool() ? "true" : "false"; + } else if (expectedValue.isDouble()) { + expectedValueString = QString::number(expectedValue.toDouble()); + } + QString result = object.value("result").toString(); + + if (result == "fail") { + stream << "\t\t\t\n"; + stream << "\t\t\t\t" + key + "\n"; + stream << "\t\t\t\t" + actualValueString + "\n"; + stream << "\t\t\t\t" + expectedValueString + "\n"; + stream << "\t\t\t\n"; + } + } } else { - stream << "\t\t\t\t

No Image Found

\n"; + stream << "\t\t\t\n"; + stream << "\t\t\t\t

" << QString::number(index) << "

\n"; + + stream << "\t\t\t\t\n"; + stream << "\t\t\t\t\n"; + + if (differenceFileFound) { + stream << "\t\t\t\t\n"; + } else { + stream << "\t\t\t\t

No Image Found

\n"; + } + + stream << "\t\t\t\n"; } - stream << "\t\t\t\n"; } void AWSInterface::updateAWS() { diff --git a/tools/nitpick/src/AWSInterface.h b/tools/nitpick/src/AWSInterface.h index c5be5f35bb..43d2240c19 100644 --- a/tools/nitpick/src/AWSInterface.h +++ b/tools/nitpick/src/AWSInterface.h @@ -40,10 +40,10 @@ public: void writeTitle(QTextStream& stream); void writeTable(QTextStream& stream); - void openTable(QTextStream& stream); + void openTable(QTextStream& stream, const QString& testResult, const bool isFailure); void closeTable(QTextStream& stream); - void createEntry(int index, const QString& testResult, QTextStream& stream, const bool isFailure); + void createEntry(const int index, const QString& testResult, QTextStream& stream, const bool isFailure); void updateAWS(); From 8938afd35015378b4fa77d2086f4070d68d0048e Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 6 Dec 2018 08:42:38 -0800 Subject: [PATCH 40/70] Updated for v1.2 --- tools/nitpick/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/nitpick/README.md b/tools/nitpick/README.md index 7d75d660d7..23105a0e02 100644 --- a/tools/nitpick/README.md +++ b/tools/nitpick/README.md @@ -5,7 +5,7 @@ Nitpick is a stand alone application that provides a mechanism for regression te * The snapshots are compared to a 'canonical' set of images that have been produced beforehand. * The result, if any test failed, is a zipped folder describing the failure. -Nitpick has 5 functions, separated into 4 tabs: +Nitpick has 5 functions, separated into separate tabs: 1. Creating tests, MD files and recursive scripts 1. Windows task bar utility (Windows only) 1. Running tests @@ -22,9 +22,9 @@ Nitpick is built as part of the High Fidelity build. 1. Select all, right-click and select 7-Zip->Add to archive... 1. Set Archive format to 7z 1. Check "Create SFX archive -1. Enter installer name (i.e. `nitpick-installer-v1.1.exe`) +1. Enter installer name (i.e. `nitpick-installer-v1.2.exe`) 1. Click "OK" -1. Copy created installer to https://hifi-qa.s3.amazonaws.com/nitpick/Windows/nitpick-installer-v1.1.exe: aws s3 cp nitpick-installer-v1.1.exe s3://hifi-qa/nitpick/Mac/nitpick-installer-v1.1.exe +1. Copy created installer to https://hifi-qa.s3.amazonaws.com/nitpick/Windows/nitpick-installer-v1.2.exe: aws s3 cp nitpick-installer-v1.2.exe s3://hifi-qa/nitpick/Mac/nitpick-installer-v1.2.exe #### Mac These steps assume the hifi repository has been cloned to `~/hifi`. 1. (first time) Install brew @@ -37,12 +37,12 @@ These steps assume the hifi repository has been cloned to `~/hifi`. 1. Change the loader instruction to find the dynamic library locally In a terminal: `install_name_tool -change ~/hifi/build/ext/Xcode/quazip/project/lib/libquazip5.1.dylib libquazip5.1.dylib nitpick` 1. Delete any existing disk images. In a terminal: `rm *.dmg` -1. Create installer (note final period).In a terminal: `create-dmg --volname nitpick-installer-v1.1 nitpick-installer-v1.1.dmg .` +1. Create installer (note final period).In a terminal: `create-dmg --volname nitpick-installer-v1.2 nitpick-installer-v1.2.dmg .` Make sure to wait for completion. -1. Copy created installer to AWS: `~/Library/Python/3.7/bin/aws s3 cp nitpick-installer-v1.1.dmg s3://hifi-qa/nitpick/Mac/nitpick-installer-v1.1.dmg` +1. Copy created installer to AWS: `~/Library/Python/3.7/bin/aws s3 cp nitpick-installer-v1.2.dmg s3://hifi-qa/nitpick/Mac/nitpick-installer-v1.2.dmg` ### Installation #### Windows -1. (First time) download and install vc_redist.x64.exe (available at https://hifi-qa.s3.amazonaws.com/nitpick/Windows/nitpick-installer-v1.1.exe) +1. (First time) download and install vc_redist.x64.exe (available at https://hifi-qa.s3.amazonaws.com/nitpick/Windows/nitpick-installer-v1.2.exe) 1. (First time) download and install Python 3 from https://hifi-qa.s3.amazonaws.com/nitpick/Windows/python-3.7.0-amd64.exe (also located at https://www.python.org/downloads/) 1. After installation - create an environment variable called PYTHON_PATH and set it to the folder containing the Python executable. 1. (First time) download and install AWS CLI from https://hifi-qa.s3.amazonaws.com/nitpick/Windows/AWSCLI64PY3.msi (also available at https://aws.amazon.com/cli/ @@ -52,7 +52,7 @@ These steps assume the hifi repository has been cloned to `~/hifi`. 1. Leave region name and ouput format as default [None] 1. Install the latest release of Boto3 via pip: `pip install boto3` -1. Download the installer by browsing to [here]() +1. Download the installer by browsing to [here]() 1. Double click on the installer and install to a convenient location ![](./setup_7z.PNG) @@ -76,14 +76,14 @@ In a terminal: `python3 get-pip.py --user` 1. Enter the secret key 1. Leave region name and ouput format as default [None] 1. Install the latest release of Boto3 via pip: pip3 install boto3 -1. Download the installer by browsing to [here](). +1. Download the installer by browsing to [here](). 1. Double-click on the downloaded image to mount it 1. Create a folder for the nitpick files (e.g. ~/nitpick) If this folder exists then delete all it's contents. 1. Copy the downloaded files to the folder In a terminal: `cd ~/nitpick` - `cp -r /Volumes/nitpick-installer-v1.1/* .` + `cp -r /Volumes/nitpick-installer-v1.2/* .` 1. __To run nitpick, cd to the folder that you copied to and run `./nitpick`__ # Usage From a665e728e6af8978c2b3c49c054f13fbd04cf8d8 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 6 Dec 2018 09:52:21 -0800 Subject: [PATCH 41/70] Improved contents of the HTML results. --- tools/nitpick/src/AWSInterface.cpp | 121 ++++++++++++++++------------- tools/nitpick/src/AWSInterface.h | 4 +- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/tools/nitpick/src/AWSInterface.cpp b/tools/nitpick/src/AWSInterface.cpp index 034feae7f9..0b93ce44e5 100644 --- a/tools/nitpick/src/AWSInterface.cpp +++ b/tools/nitpick/src/AWSInterface.cpp @@ -103,62 +103,8 @@ void AWSInterface::writeHead(QTextStream& stream) { void AWSInterface::writeBody(QTextStream& stream) { stream << "\t" << "\n"; - writeTitle(stream); - writeTable(stream); - stream << "\t" << "\n"; -} -void AWSInterface::finishHTMLpage(QTextStream& stream) { - stream << "\n"; -} - -void AWSInterface::writeTitle(QTextStream& stream) { - // Separate relevant components from the results name - // The expected format is as follows: `D:/tt/snapshots/TestResults--2018-10-04_11-09-41(PR14128)[DESKTOP-PMKNLSQ].zip` - QStringList tokens = _testResults.split('/'); - - // date_buildorPR_hostName will be 2018-10-03_15-35-28(9433)[DESKTOP-PMKNLSQ] - QString date_buildorPR_hostName = tokens[tokens.length() - 1].split("--")[1].split(".")[0]; - - QString buildorPR = date_buildorPR_hostName.split('(')[1].split(')')[0]; - QString hostName = date_buildorPR_hostName.split('[')[1].split(']')[0]; - - QStringList dateList = date_buildorPR_hostName.split('(')[0].split('_')[0].split('-'); - QString year = dateList[0]; - QString month = dateList[1]; - QString day = dateList[2]; - - QStringList timeList = date_buildorPR_hostName.split('(')[0].split('_')[1].split('-'); - QString hour = timeList[0]; - QString minute = timeList[1]; - QString second = timeList[2]; - - const QString months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - - stream << "\t" << "\t" << "\n"; - stream << "\t" << "\t" << "

Failures for "; - stream << months[month.toInt() - 1] << " " << day << ", " << year << ", "; - stream << hour << ":" << minute << ":" << second << ", "; - - if (buildorPR.left(2) == "PR") { - stream << "PR " << buildorPR.right(buildorPR.length() - 2) << ", "; - } else { - stream << "build " << buildorPR << ", "; - } - - stream << "run on " << hostName << "

\n"; -} - -void AWSInterface::writeTable(QTextStream& stream) { - QString previousTestName{ "" }; - - // Loop over all entries in directory. This is done in stages, as the names are not in the order of the tests - // The first stage reads the directory names into a list - // The second stage renames the tests by removing everything up to "--tests." - // The third stage renames the directories - // The fourth and lasts stage creates the HTML entries - // - // Note that failures are processed first, then successes + // The results are read here as they are used both in the title (for the summary) and for table QStringList originalNamesFailures; QStringList originalNamesSuccesses; QDirIterator it1(_workingDirectory); @@ -185,6 +131,71 @@ void AWSInterface::writeTable(QTextStream& stream) { } } + writeTitle(stream, originalNamesFailures, originalNamesSuccesses); + writeTable(stream, originalNamesFailures, originalNamesSuccesses); + stream << "\t" << "\n"; +} + +void AWSInterface::finishHTMLpage(QTextStream& stream) { + stream << "\n"; +} + +void AWSInterface::writeTitle(QTextStream& stream, const QStringList& originalNamesFailures, const QStringList& originalNamesSuccesses) { + // Separate relevant components from the results name + // The expected format is as follows: `D:/tt/snapshots/TestResults--2018-10-04_11-09-41(PR14128)[DESKTOP-PMKNLSQ].zip` + QStringList tokens = _testResults.split('/'); + + // date_buildorPR_hostName will be 2018-10-03_15-35-28(9433)[DESKTOP-PMKNLSQ] + QString date_buildorPR_hostName = tokens[tokens.length() - 1].split("--")[1].split(".")[0]; + + QString buildorPR = date_buildorPR_hostName.split('(')[1].split(')')[0]; + QString hostName = date_buildorPR_hostName.split('[')[1].split(']')[0]; + + QStringList dateList = date_buildorPR_hostName.split('(')[0].split('_')[0].split('-'); + QString year = dateList[0]; + QString month = dateList[1]; + QString day = dateList[2]; + + QStringList timeList = date_buildorPR_hostName.split('(')[0].split('_')[1].split('-'); + QString hour = timeList[0]; + QString minute = timeList[1]; + QString second = timeList[2]; + + const QString months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + + stream << "\t" << "\t" << "\n"; + stream << "\t" << "\t" << "

Results for "; + stream << months[month.toInt() - 1] << " " << day << ", " << year << ", "; + stream << hour << ":" << minute << ":" << second << ", "; + + if (buildorPR.left(2) == "PR") { + stream << "PR " << buildorPR.right(buildorPR.length() - 2) << ", "; + } else { + stream << "build " << buildorPR << ", "; + } + + stream << "run on " << hostName << "

\n"; + + int numberOfFailures = originalNamesFailures.length(); + int numberOfSuccesses = originalNamesSuccesses.length(); + + stream << "

" << QString::number(numberOfFailures) << " failed, out of a total of " << QString::number(numberOfSuccesses) << " tests

\n"; + + stream << "\t" << "\t" << "\n"; + stream << "\t" << "\t" << "

The following tests failed:

"; +} + +void AWSInterface::writeTable(QTextStream& stream, const QStringList& originalNamesFailures, const QStringList& originalNamesSuccesses) { + QString previousTestName{ "" }; + + // Loop over all entries in directory. This is done in stages, as the names are not in the order of the tests + // The first stage reads the directory names into a list + // The second stage renames the tests by removing everything up to "--tests." + // The third stage renames the directories + // The fourth and lasts stage creates the HTML entries + // + // Note that failures are processed first, then successes + QStringList newNamesFailures; for (int i = 0; i < originalNamesFailures.length(); ++i) { newNamesFailures.append(originalNamesFailures[i].split("--tests.")[1]); diff --git a/tools/nitpick/src/AWSInterface.h b/tools/nitpick/src/AWSInterface.h index 43d2240c19..fda250b115 100644 --- a/tools/nitpick/src/AWSInterface.h +++ b/tools/nitpick/src/AWSInterface.h @@ -38,8 +38,8 @@ public: void writeBody(QTextStream& stream); void finishHTMLpage(QTextStream& stream); - void writeTitle(QTextStream& stream); - void writeTable(QTextStream& stream); + void writeTitle(QTextStream& stream, const QStringList& originalNamesFailures, const QStringList& originalNamesSuccesses); + void writeTable(QTextStream& stream, const QStringList& originalNamesFailures, const QStringList& originalNamesSuccesses); void openTable(QTextStream& stream, const QString& testResult, const bool isFailure); void closeTable(QTextStream& stream); From 4a50baddc2b25da7f5a5d53c95be0e5a7926449b Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 6 Dec 2018 09:55:48 -0800 Subject: [PATCH 42/70] Reverted debug code. --- libraries/audio-client/src/AudioClient.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 9d0a2ea79b..9bad7e2f45 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -674,7 +674,6 @@ void AudioClient::start() { } void AudioClient::stop() { - return; qCDebug(audioclient) << "AudioClient::stop(), requesting switchInputToAudioDevice() to shut down"; switchInputToAudioDevice(QAudioDeviceInfo(), true); From 1171821fc9993d2cd510ffd34a3cd3ef88821068 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 5 Dec 2018 17:39:15 -0800 Subject: [PATCH 43/70] unity avatar exporter plugin --- .../unity-avatar-exporter/Assets/Editor.meta | 8 + .../Assets/Editor/AvatarExporter.cs | 207 +++++++++ .../Assets/Editor/AvatarExporter.cs.meta | 11 + .../unity-avatar-exporter/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 258 +++++++++++ .../Assets/Scenes/SampleScene.unity.meta | 7 + .../Unity.PackageManagerUI.Editor.csproj | 402 +++++++++++++++++ .../Unity.TextMeshPro.Editor.csproj | 403 ++++++++++++++++++ .../Unity.TextMeshPro.csproj | 400 +++++++++++++++++ .../UnityEditor.StandardEvents.csproj | 359 ++++++++++++++++ .../avatarExporter.unitypackage | Bin 0 -> 2836 bytes tools/unity-avatar-exporter/packager.bat | 1 + .../unity-avatar-exporter.Editor.csproj | 386 +++++++++++++++++ .../unity-avatar-exporter.sln | 44 ++ 14 files changed, 2494 insertions(+) create mode 100644 tools/unity-avatar-exporter/Assets/Editor.meta create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs.meta create mode 100644 tools/unity-avatar-exporter/Assets/Scenes.meta create mode 100644 tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity create mode 100644 tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta create mode 100644 tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj create mode 100644 tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj create mode 100644 tools/unity-avatar-exporter/Unity.TextMeshPro.csproj create mode 100644 tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj create mode 100644 tools/unity-avatar-exporter/avatarExporter.unitypackage create mode 100644 tools/unity-avatar-exporter/packager.bat create mode 100644 tools/unity-avatar-exporter/unity-avatar-exporter.Editor.csproj create mode 100644 tools/unity-avatar-exporter/unity-avatar-exporter.sln diff --git a/tools/unity-avatar-exporter/Assets/Editor.meta b/tools/unity-avatar-exporter/Assets/Editor.meta new file mode 100644 index 0000000000..aac82b4258 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51b3237a2992bd449a58ade16e52d0e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs new file mode 100644 index 0000000000..60b5e0e643 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -0,0 +1,207 @@ +// AvatarExporter.cs +// +// Created by David Back on 28 Nov 2018 +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + +using UnityEngine; +using UnityEditor; +using System; +using System.IO; +using System.Collections.Generic; + +public class AvatarExporter : MonoBehaviour { + public static Dictionary UNITY_TO_HIFI_JOINT_NAME = new Dictionary { + {"Chest", "Spine1"}, + {"Head", "Head"}, + {"Hips", "Hips"}, + {"Left Index Distal", "LeftHandIndex3"}, + {"Left Index Intermediate", "LeftHandIndex2"}, + {"Left Index Proximal", "LeftHandIndex1"}, + {"Left Little Distal", "LeftHandPinky3"}, + {"Left Little Intermediate", "LeftHandPinky2"}, + {"Left Little Proximal", "LeftHandPinky1"}, + {"Left Middle Distal", "LeftHandMiddle3"}, + {"Left Middle Intermediate", "LeftHandMiddle2"}, + {"Left Middle Proximal", "LeftHandMiddle1"}, + {"Left Ring Distal", "LeftHandRing3"}, + {"Left Ring Intermediate", "LeftHandRing2"}, + {"Left Ring Proximal", "LeftHandRing1"}, + {"Left Thumb Distal", "LeftHandThumb3"}, + {"Left Thumb Intermediate", "LeftHandThumb2"}, + {"Left Thumb Proximal", "LeftHandThumb1"}, + {"LeftEye", "LeftEye"}, + {"LeftFoot", "LeftFoot"}, + {"LeftHand", "LeftHand"}, + {"LeftLowerArm", "LeftForeArm"}, + {"LeftLowerLeg", "LeftLeg"}, + {"LeftShoulder", "LeftShoulder"}, + {"LeftToes", "LeftToeBase"}, + {"LeftUpperArm", "LeftArm"}, + {"LeftUpperLeg", "LeftUpLeg"}, + {"Neck", "Neck"}, + {"Right Index Distal", "RightHandIndex3"}, + {"Right Index Intermediate", "RightHandIndex2"}, + {"Right Index Proximal", "RightHandIndex1"}, + {"Right Little Distal", "RightHandPinky3"}, + {"Right Little Intermediate", "RightHandPinky2"}, + {"Right Little Proximal", "RightHandPinky1"}, + {"Right Middle Distal", "RightHandMiddle3"}, + {"Right Middle Intermediate", "RightHandMiddle2"}, + {"Right Middle Proximal", "RightHandMiddle1"}, + {"Right Ring Distal", "RightHandRing3"}, + {"Right Ring Intermediate", "RightHandRing2"}, + {"Right Ring Proximal", "RightHandRing1"}, + {"Right Thumb Distal", "RightHandThumb3"}, + {"Right Thumb Intermediate", "RightHandThumb2"}, + {"Right Thumb Proximal", "RightHandThumb1"}, + {"RightEye", "RightEye"}, + {"RightFoot", "RightFoot"}, + {"RightHand", "RightHand"}, + {"RightLowerArm", "RightForeArm"}, + {"RightLowerLeg", "RightLeg"}, + {"RightShoulder", "RightShoulder"}, + {"RightToes", "RightToeBase"}, + {"RightUpperArm", "RightArm"}, + {"RightUpperLeg", "RightUpLeg"}, + {"Spine", "Spine"}, + {"UpperChest", "Spine2"}, + }; + + public static string exportedPath = String.Empty; + + [MenuItem("High Fidelity/Export New Avatar")] + public static void ExportNewAvatar() { + ExportSelectedAvatar(false); + } + + [MenuItem("High Fidelity/Export New Avatar", true)] + private static bool ExportNewAvatarValidator() { + // only enable Export New Avatar option if we have an asset selected + string[] guids = Selection.assetGUIDs; + return guids.Length > 0; + } + + [MenuItem("High Fidelity/Update Avatar")] + public static void UpdateAvatar() { + ExportSelectedAvatar(true); + } + + [MenuItem("High Fidelity/Update Avatar", true)] + private static bool UpdateAvatarValidation() { + // only enable Update Avatar option if the selected avatar is the last one that was exported + if (exportedPath != String.Empty) { + string[] guids = Selection.assetGUIDs; + if (guids.Length > 0) { + string selectedAssetPath = AssetDatabase.GUIDToAssetPath(guids[0]); + string selectedAsset = Path.GetFileNameWithoutExtension(selectedAssetPath); + string exportedAsset = Path.GetFileNameWithoutExtension(exportedPath); + return exportedAsset == selectedAsset; + } + } + return false; + } + + public static void ExportSelectedAvatar(bool usePreviousPath) { + string assetPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); + if (assetPath.LastIndexOf(".fbx") == -1) { + EditorUtility.DisplayDialog("Error", "Please select an fbx avatar to export", "Ok"); + return; + } + ModelImporter importer = ModelImporter.GetAtPath(assetPath) as ModelImporter; + if (importer == null) { + EditorUtility.DisplayDialog("Error", "Please select a model", "Ok"); + return; + } + if (importer.animationType != ModelImporterAnimationType.Human) { + EditorUtility.DisplayDialog("Error", "Please set model's Animation Type to Humanoid", "Ok"); + return; + } + + // store joint mappings only for joints that exist in hifi and verify missing joints + HumanDescription humanDescription = importer.humanDescription; + HumanBone[] boneMap = humanDescription.human; + Dictionary jointMappings = new Dictionary(); + foreach (HumanBone bone in boneMap) { + string humanBone = bone.humanName; + string hifiJointName; + if (UNITY_TO_HIFI_JOINT_NAME.TryGetValue(humanBone, out hifiJointName)) { + jointMappings.Add(hifiJointName, bone.boneName); + } + } + if (!jointMappings.ContainsKey("Hips")) { + EditorUtility.DisplayDialog("Error", "There is no Hips bone in selected avatar", "Ok"); + return; + } + if (!jointMappings.ContainsKey("Spine")) { + EditorUtility.DisplayDialog("Error", "There is no Spine bone in selected avatar", "Ok"); + return; + } + if (!jointMappings.ContainsKey("Spine1")) { + EditorUtility.DisplayDialog("Error", "There is no Chest bone in selected avatar", "Ok"); + return; + } + if (!jointMappings.ContainsKey("Spine2")) { + // if there is no UpperChest (Spine2) bone then we remap Chest (Spine1) to Spine2 in hifi and skip Spine1 + jointMappings["Spine2"] = jointMappings["Spine1"]; + jointMappings.Remove("Spine1"); + } + + // open folder explorer defaulting to user documents folder to select target path if exporting new avatar, + // otherwise use previously exported path if updating avatar + string directoryPath; + string assetName = Path.GetFileNameWithoutExtension(assetPath); + if (!usePreviousPath || exportedPath == String.Empty) { + string documentsFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); + if (!SelectExportFolder(assetName, documentsFolder, out directoryPath)) { + return; + } + } else { + directoryPath = Path.GetDirectoryName(exportedPath) + "/"; + } + Directory.CreateDirectory(directoryPath); + + // delete any existing fst since we agreed to overwrite it + string fstPath = directoryPath + assetName + ".fst"; + if (File.Exists(fstPath)) { + File.Delete(fstPath); + } + + // write out core fields to top of fst file + File.WriteAllText(fstPath, "name = " + assetName + "\ntype = body+head\nscale = 1\nfilename = " + + assetName + ".fbx\n" + "texdir = textures\n"); + + // write out joint mappings to fst file + foreach (var jointMapping in jointMappings) { + File.AppendAllText(fstPath, "jointMap = " + jointMapping.Key + " = " + jointMapping.Value + "\n"); + } + + // delete any existing fbx since we agreed to overwrite it, and copy fbx over + string targetAssetPath = directoryPath + assetName + ".fbx"; + if (File.Exists(targetAssetPath)) { + File.Delete(targetAssetPath); + } + File.Copy(assetPath, targetAssetPath); + + exportedPath = targetAssetPath; + } + + public static bool SelectExportFolder(string assetName, string initialPath, out string directoryPath) { + string selectedPath = EditorUtility.OpenFolderPanel("Select export location", initialPath, ""); + if (selectedPath.Length == 0) { // folder selection cancelled + directoryPath = ""; + return false; + } + directoryPath = selectedPath + "/" + assetName + "/"; + if (Directory.Exists(directoryPath)) { + bool overwrite = EditorUtility.DisplayDialog("Error", "Directory " + assetName + + " already exists here, would you like to overwrite it?", "Yes", "No"); + if (!overwrite) { + SelectExportFolder(assetName, selectedPath, out directoryPath); + } + } + return true; + } +} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs.meta b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs.meta new file mode 100644 index 0000000000..c71e4c396d --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7a34be82b3ae554ea097963914b083f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tools/unity-avatar-exporter/Assets/Scenes.meta b/tools/unity-avatar-exporter/Assets/Scenes.meta new file mode 100644 index 0000000000..17072cfd6a --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f704ae4b4f98ae41a0bce26658850c1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000000..6511ad2971 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity @@ -0,0 +1,258 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 10 + m_AtlasSize: 512 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 256 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &170076733 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 170076735} + - component: {fileID: 170076734} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &170076734 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 170076733} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &170076735 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 170076733} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &534669902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 534669905} + - component: {fileID: 534669904} + - component: {fileID: 534669903} + m_Layer: 0 + m_Name: Main Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &534669903 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 534669902} + m_Enabled: 1 +--- !u!20 &534669904 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 534669902} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &534669905 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 534669902} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000000..9531828bcd --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99c9720ab356a0642a771bea13969a05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj b/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj new file mode 100644 index 0000000000..69a90a40fc --- /dev/null +++ b/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj @@ -0,0 +1,402 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D} + Library + Unity.PackageManagerUI.Editor + 512 + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + .NETFramework + v3.5 + Unity Full v3.5 + + Editor:5 + StandaloneWindows64:19 + 2018.2.18f1 + + 4 + + + pdbonly + false + Temp\UnityVS_bin\Debug\ + Temp\UnityVS_obj\Debug\ + prompt + 4 + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + pdbonly + false + Temp\UnityVS_bin\Release\ + Temp\UnityVS_obj\Release\ + prompt + 4 + TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + + + + + + + + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll + + + C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll + + + C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll + + + C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll + + + C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj b/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj new file mode 100644 index 0000000000..e73e797cbe --- /dev/null +++ b/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj @@ -0,0 +1,403 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {3A848AB7-9891-EDDA-D555-BF184C2F81F4} + Library + Unity.TextMeshPro.Editor + 512 + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + .NETFramework + v3.5 + Unity Full v3.5 + + Editor:5 + StandaloneWindows64:19 + 2018.2.18f1 + + 4 + + + pdbonly + false + Temp\UnityVS_bin\Debug\ + Temp\UnityVS_obj\Debug\ + prompt + 4 + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + pdbonly + false + Temp\UnityVS_bin\Release\ + Temp\UnityVS_obj\Release\ + prompt + 4 + TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + + + + + + + + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll + + + C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll + + + C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll + + + C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll + + + C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll + + + + + {07A21C90-D344-AE1A-8456-9910C203B41A} + Unity.TextMeshPro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj b/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj new file mode 100644 index 0000000000..971a6148b1 --- /dev/null +++ b/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj @@ -0,0 +1,400 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {07A21C90-D344-AE1A-8456-9910C203B41A} + Library + Unity.TextMeshPro + 512 + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + .NETFramework + v3.5 + Unity Subset v3.5 + + Game:1 + StandaloneWindows64:19 + 2018.2.18f1 + + 4 + + + pdbonly + false + Temp\UnityVS_bin\Debug\ + Temp\UnityVS_obj\Debug\ + prompt + 4 + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + pdbonly + false + Temp\UnityVS_bin\Release\ + Temp\UnityVS_obj\Release\ + prompt + 4 + TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + + + + + + + + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll + + + C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll + + + C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll + + + C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll + + + C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\mscorlib.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Core.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Runtime.Serialization.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Xml.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Xml.Linq.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\UnityScript.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\UnityScript.Lang.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\Boo.Lang.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj b/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj new file mode 100644 index 0000000000..6489fc514a --- /dev/null +++ b/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj @@ -0,0 +1,359 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {6800202F-4402-D405-F8CB-03DC7BD78B92} + Library + UnityEditor.StandardEvents + 512 + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + .NETFramework + v3.5 + Unity Full v3.5 + + Editor:5 + StandaloneWindows64:19 + 2018.2.18f1 + + 4 + + + pdbonly + false + Temp\UnityVS_bin\Debug\ + Temp\UnityVS_obj\Debug\ + prompt + 4 + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + pdbonly + false + Temp\UnityVS_bin\Release\ + Temp\UnityVS_obj\Release\ + prompt + 4 + TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + + + + + + + + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll + + + C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll + + + C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll + + + C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll + + + C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage new file mode 100644 index 0000000000000000000000000000000000000000..afddc4498b7357fd9ebd188871140616118db852 GIT binary patch literal 2836 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 + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {C03F9C15-54AA-E5FF-7017-7CEBE37FC988} + Library + Assembly-CSharp-Editor + 512 + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + .NETFramework + v3.5 + Unity Full v3.5 + + Editor:5 + StandaloneWindows64:19 + 2018.2.18f1 + + 4 + + + pdbonly + false + Temp\UnityVS_bin\Debug\ + Temp\UnityVS_obj\Debug\ + prompt + 4 + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + pdbonly + false + Temp\UnityVS_bin\Release\ + Temp\UnityVS_obj\Release\ + prompt + 4 + TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU + true + + + + + + + + + + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll + + + C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/Editor/UnityEditor.TestRunner.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/UnityEngine.TestRunner.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/net35/unity-custom/nunit.framework.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll + + + C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll + + + C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll + + + C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll + + + C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll + + + C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll + + + C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll + + + + + {6800202F-4402-D405-F8CB-03DC7BD78B92} + UnityEditor.StandardEvents + + + {3A848AB7-9891-EDDA-D555-BF184C2F81F4} + Unity.TextMeshPro.Editor + + + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D} + Unity.PackageManagerUI.Editor + + + {07A21C90-D344-AE1A-8456-9910C203B41A} + Unity.TextMeshPro + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/unity-avatar-exporter/unity-avatar-exporter.sln b/tools/unity-avatar-exporter/unity-avatar-exporter.sln new file mode 100644 index 0000000000..9f608ed5c3 --- /dev/null +++ b/tools/unity-avatar-exporter/unity-avatar-exporter.sln @@ -0,0 +1,44 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro", "Unity.TextMeshPro.csproj", "{07A21C90-D344-AE1A-8456-9910C203B41A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.PackageManagerUI.Editor", "Unity.PackageManagerUI.Editor.csproj", "{6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro.Editor", "Unity.TextMeshPro.Editor.csproj", "{3A848AB7-9891-EDDA-D555-BF184C2F81F4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEditor.StandardEvents", "UnityEditor.StandardEvents.csproj", "{6800202F-4402-D405-F8CB-03DC7BD78B92}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "unity-avatar-exporter.Editor", "unity-avatar-exporter.Editor.csproj", "{C03F9C15-54AA-E5FF-7017-7CEBE37FC988}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {07A21C90-D344-AE1A-8456-9910C203B41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07A21C90-D344-AE1A-8456-9910C203B41A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07A21C90-D344-AE1A-8456-9910C203B41A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07A21C90-D344-AE1A-8456-9910C203B41A}.Release|Any CPU.Build.0 = Release|Any CPU + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Release|Any CPU.Build.0 = Release|Any CPU + {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Release|Any CPU.Build.0 = Release|Any CPU + {6800202F-4402-D405-F8CB-03DC7BD78B92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6800202F-4402-D405-F8CB-03DC7BD78B92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6800202F-4402-D405-F8CB-03DC7BD78B92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6800202F-4402-D405-F8CB-03DC7BD78B92}.Release|Any CPU.Build.0 = Release|Any CPU + {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal From 37854ab05eb061961d83e5d10f5b4d71a2dd5c4a Mon Sep 17 00:00:00 2001 From: Luis Cuenca Date: Thu, 6 Dec 2018 11:58:48 -0800 Subject: [PATCH 44/70] Add jsdoc information --- libraries/entities/src/EntityScriptingInterface.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index ad1c11ba41..4b06d2d16b 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -980,7 +980,16 @@ public slots: */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); + + /**jsdoc + * Get the index of the parent joint. + * @function Entities.getJointParent + * @param {Uuid} entityID - The ID of the entity. + * @param {number} index - The integer index of the joint. + * @returns {number} The index of the parent joint. + */ Q_INVOKABLE int getJointParent(const QUuid& entityID, int index); + /**jsdoc * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and * orientation. From 6ea4769173d2000f92a0d9a1962a89d1591434dc Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 6 Dec 2018 13:38:57 -0800 Subject: [PATCH 45/70] Re-name MIMETypeLibrary to MediaTypeLibrary and update related references --- libraries/fbx/src/FBXSerializer.cpp | 12 ++--- libraries/fbx/src/GLTFSerializer.cpp | 12 ++--- libraries/fbx/src/OBJSerializer.cpp | 10 ++-- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 30 ++++++------ libraries/hfm/src/hfm/HFMFormatRegistry.h | 22 ++++----- libraries/hfm/src/hfm/HFMSimpleFormat.h | 14 +++--- .../src/model-networking/ModelLoader.cpp | 2 +- ...METypeLibrary.cpp => MediaTypeLibrary.cpp} | 44 ++++++++--------- .../{MIMETypeLibrary.h => MediaTypeLibrary.h} | 48 +++++++++---------- 9 files changed, 97 insertions(+), 97 deletions(-) rename libraries/shared/src/shared/{MIMETypeLibrary.cpp => MediaTypeLibrary.cpp} (53%) rename libraries/shared/src/shared/{MIMETypeLibrary.h => MediaTypeLibrary.h} (57%) diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index b57ff183a0..ccbda9af33 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -1834,14 +1834,14 @@ HFMModel* FBXSerializer::extractHFMModel(const QVariantHash& mapping, const QStr return hfmModelPtr; } -MIMEType getFBXMIMEType() { - MIMEType mimeType("fbx"); - mimeType.extensions.push_back("fbx"); - mimeType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); - return mimeType; +MediaType getFBXMediaType() { + MediaType mediaType("fbx"); + mediaType.extensions.push_back("fbx"); + mediaType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); + return mediaType; } -std::shared_ptr FBXSerializer::FORMAT = std::make_shared>(getFBXMIMEType()); +std::shared_ptr FBXSerializer::FORMAT = std::make_shared>(getFBXMediaType()); HFMModel::Pointer FBXSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { QBuffer buffer(const_cast(&data)); diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index b841226a9e..cfa2124c5d 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -906,14 +906,14 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const QUrl& url) { return true; } -MIMEType getGLTFMIMEType() { - MIMEType mimeType("gltf"); - mimeType.extensions.push_back("gltf"); - mimeType.webMediaTypes.push_back("model/gltf+json"); - return mimeType; +MediaType getGLTFMediaType() { + MediaType mediaType("gltf"); + mediaType.extensions.push_back("gltf"); + mediaType.webMediaTypes.push_back("model/gltf+json"); + return mediaType; } -std::shared_ptr GLTFSerializer::FORMAT = std::make_shared>(getGLTFMIMEType()); +std::shared_ptr GLTFSerializer::FORMAT = std::make_shared>(getGLTFMediaType()); HFMModel::Pointer GLTFSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/fbx/src/OBJSerializer.cpp index 62b33e3690..b85ca7ebca 100644 --- a/libraries/fbx/src/OBJSerializer.cpp +++ b/libraries/fbx/src/OBJSerializer.cpp @@ -652,13 +652,13 @@ done: return result; } -MIMEType getOBJMIMEType() { - MIMEType mimeType("obj"); - mimeType.extensions.push_back("obj"); - return mimeType; +MediaType getOBJMediaType() { + MediaType mediaType("obj"); + mediaType.extensions.push_back("obj"); + return mediaType; } -std::shared_ptr OBJSerializer::FORMAT = std::make_shared>(getOBJMIMEType()); +std::shared_ptr OBJSerializer::FORMAT = std::make_shared>(getOBJMediaType()); HFMModel::Pointer OBJSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { PROFILE_RANGE_EX(resource_parse, __FUNCTION__, 0xffff0000, nullptr); diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 8ff11d851d..60606bc018 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -13,53 +13,53 @@ namespace hfm { -FormatRegistry::MIMETypeID FormatRegistry::registerMIMEType(const MIMEType& mimeType, std::unique_ptr supportedFactory) { +FormatRegistry::MediaTypeID FormatRegistry::registerMediaType(const MediaType& mediaType, std::unique_ptr supportedFactory) { std::lock_guard lock(_libraryLock); - MIMETypeID id = _mimeTypeLibrary.registerMIMEType(mimeType); + MediaTypeID id = _mediaTypeLibrary.registerMediaType(mediaType); _supportedFormats.emplace_back(id, supportedFactory); return id; } -void FormatRegistry::unregisterMIMEType(const MIMETypeID& mimeTypeID) { +void FormatRegistry::unregisterMediaType(const MediaTypeID& mediaTypeID) { std::lock_guard lock(_libraryLock); for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { - if ((*it).mimeTypeID == mimeTypeID) { + if ((*it).mediaTypeID == mediaTypeID) { _supportedFormats.erase(it); break; } } - _mimeTypeLibrary.unregisterMIMEType(mimeTypeID); + _mediaTypeLibrary.unregisterMediaType(mediaTypeID); } -std::shared_ptr FormatRegistry::getSerializerForMIMETypeID(FormatRegistry::MIMETypeID mimeTypeID) const { +std::shared_ptr FormatRegistry::getSerializerForMediaTypeID(FormatRegistry::MediaTypeID mediaTypeID) const { // TODO: shared_lock in C++14 std::lock_guard lock(*const_cast(&_libraryLock)); for (auto it = _supportedFormats.begin(); it != _supportedFormats.end(); it++) { - if ((*it).mimeTypeID == mimeTypeID) { + if ((*it).mediaTypeID == mediaTypeID) { return (*it).factory->get(); } } return std::shared_ptr(); } -std::shared_ptr FormatRegistry::getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { - MIMETypeID id; +std::shared_ptr FormatRegistry::getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { + MediaTypeID id; { // TODO: shared_lock in C++14 std::lock_guard lock(*const_cast(&_libraryLock)); - id = _mimeTypeLibrary.findMIMETypeForData(data); - if (id == INVALID_MIME_TYPE_ID) { - id = _mimeTypeLibrary.findMIMETypeForURL(url); + id = _mediaTypeLibrary.findMediaTypeForData(data); + if (id == INVALID_MEDIA_TYPE_ID) { + id = _mediaTypeLibrary.findMediaTypeForURL(url); } - if (id == INVALID_MIME_TYPE_ID) { - id = _mimeTypeLibrary.findMIMETypeForMediaType(webMediaType); + if (id == INVALID_MEDIA_TYPE_ID) { + id = _mediaTypeLibrary.findMediaTypeForWebID(webMediaType); } } - return getSerializerForMIMETypeID(id); + return getSerializerForMediaTypeID(id); } }; diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index 92076e814c..203c5f5743 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -13,32 +13,32 @@ #define hifi_HFMFormatRegistry_h #include "HFMSerializer.h" -#include +#include #include namespace hfm { class FormatRegistry { public: - using MIMETypeID = MIMETypeLibrary::ID; - static const MIMETypeID INVALID_MIME_TYPE_ID { MIMETypeLibrary::INVALID_ID }; + using MediaTypeID = MediaTypeLibrary::ID; + static const MediaTypeID INVALID_MEDIA_TYPE_ID { MediaTypeLibrary::INVALID_ID }; - MIMETypeID registerMIMEType(const MIMEType& mimeType, std::unique_ptr supportedFactory); - void unregisterMIMEType(const MIMETypeID& id); + MediaTypeID registerMediaType(const MediaType& mediaType, std::unique_ptr supportedFactory); + void unregisterMediaType(const MediaTypeID& id); - std::shared_ptr getSerializerForMIMEType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; - std::shared_ptr getSerializerForMIMETypeID(MIMETypeID id) const; + std::shared_ptr getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; + std::shared_ptr getSerializerForMediaTypeID(MediaTypeID id) const; protected: - MIMETypeLibrary _mimeTypeLibrary; + MediaTypeLibrary _mediaTypeLibrary; std::mutex _libraryLock; class SupportedFormat { public: - SupportedFormat(const MIMETypeID& mimeTypeID, std::unique_ptr& factory) : - mimeTypeID(mimeTypeID), + SupportedFormat(const MediaTypeID& mediaTypeID, std::unique_ptr& factory) : + mediaTypeID(mediaTypeID), factory(std::move(factory)) { } - MIMETypeID mimeTypeID; + MediaTypeID mediaTypeID; std::unique_ptr factory; }; std::vector _supportedFormats; diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.h b/libraries/hfm/src/hfm/HFMSimpleFormat.h index c12a7233bf..0ab6636e7d 100644 --- a/libraries/hfm/src/hfm/HFMSimpleFormat.h +++ b/libraries/hfm/src/hfm/HFMSimpleFormat.h @@ -26,21 +26,21 @@ namespace hfm { template // T is an implementation of hfm::Serializer class SimpleFormat : public Format { public: - SimpleFormat(const MIMEType& mimeType) : Format(), - _mimeType(mimeType) { + SimpleFormat(const MediaType& mediaType) : Format(), + _mediaType(mediaType) { } void registerFormat(FormatRegistry& registry) override { - _mimeTypeID = registry.registerMIMEType(_mimeType, std::make_unique>()); + _mediaTypeID = registry.registerMediaType(_mediaType, std::make_unique>()); } void unregisterFormat(FormatRegistry& registry) override { - registry.unregisterMIMEType(_mimeTypeID); - _mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; + registry.unregisterMediaType(_mediaTypeID); + _mediaTypeID = hfm::FormatRegistry::INVALID_MEDIA_TYPE_ID; } protected: - MIMEType _mimeType; - hfm::FormatRegistry::MIMETypeID _mimeTypeID; + MediaType _mediaType; + hfm::FormatRegistry::MediaTypeID _mediaTypeID; }; }; diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index a69559ad38..1ef8e8ae85 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -16,7 +16,7 @@ hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { - auto serializer = DependencyManager::get()->getSerializerForMIMEType(data, url, webMediaType); + auto serializer = DependencyManager::get()->getSerializerForMediaType(data, url, webMediaType); if (!serializer) { return hfm::Model::Pointer(); } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.cpp b/libraries/shared/src/shared/MediaTypeLibrary.cpp similarity index 53% rename from libraries/shared/src/shared/MIMETypeLibrary.cpp rename to libraries/shared/src/shared/MediaTypeLibrary.cpp index 5ae4016c54..790897c3e2 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.cpp +++ b/libraries/shared/src/shared/MediaTypeLibrary.cpp @@ -1,5 +1,5 @@ // -// MIMETypeLibrary.cpp +// MediaTypeLibrary.cpp // libraries/shared/src/shared // // Created by Sabrina Shanman on 2018/11/29. @@ -9,41 +9,41 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "MIMETypeLibrary.h" +#include "MediaTypeLibrary.h" -MIMEType MIMEType::NONE = MIMEType(""); +MediaType MediaType::NONE = MediaType(""); -MIMETypeLibrary::ID MIMETypeLibrary::registerMIMEType(const MIMEType& mimeType) { +MediaTypeLibrary::ID MediaTypeLibrary::registerMediaType(const MediaType& mediaType) { ID id = nextID++; - _mimeTypes.emplace_back(id, mimeType); + _mediaTypes.emplace_back(id, mediaType); return id; } -void MIMETypeLibrary::unregisterMIMEType(const MIMETypeLibrary::ID& id) { - for (auto it = _mimeTypes.begin(); it != _mimeTypes.end(); it++) { +void MediaTypeLibrary::unregisterMediaType(const MediaTypeLibrary::ID& id) { + for (auto it = _mediaTypes.begin(); it != _mediaTypes.end(); it++) { if ((*it).id == id) { - _mimeTypes.erase(it); + _mediaTypes.erase(it); break; } } } -MIMEType MIMETypeLibrary::getMIMEType(const MIMETypeLibrary::ID& id) const { - for (auto& supportedFormat : _mimeTypes) { +MediaType MediaTypeLibrary::getMediaType(const MediaTypeLibrary::ID& id) const { + for (auto& supportedFormat : _mediaTypes) { if (supportedFormat.id == id) { - return supportedFormat.mimeType; + return supportedFormat.mediaType; } } - return MIMEType::NONE; + return MediaType::NONE; } -MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForData(const hifi::ByteArray& data) const { +MediaTypeLibrary::ID MediaTypeLibrary::findMediaTypeForData(const hifi::ByteArray& data) const { // Check file contents - for (auto& mimeType : _mimeTypes) { - for (auto& fileSignature : mimeType.mimeType.fileSignatures) { + for (auto& mediaType : _mediaTypes) { + for (auto& fileSignature : mediaType.mediaType.fileSignatures) { auto testBytes = data.mid(fileSignature.byteOffset, (int)fileSignature.bytes.size()).toStdString(); if (testBytes == fileSignature.bytes) { - return mimeType.id; + return mediaType.id; } } } @@ -51,14 +51,14 @@ MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForData(const hifi::ByteArray& return INVALID_ID; } -MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForURL(const hifi::URL& url) const { +MediaTypeLibrary::ID MediaTypeLibrary::findMediaTypeForURL(const hifi::URL& url) const { // Check file extension std::string urlString = url.path().toStdString(); std::size_t extensionSeparator = urlString.rfind('.'); if (extensionSeparator != std::string::npos) { std::string detectedExtension = urlString.substr(extensionSeparator + 1); - for (auto& supportedFormat : _mimeTypes) { - for (auto& extension : supportedFormat.mimeType.extensions) { + for (auto& supportedFormat : _mediaTypes) { + for (auto& extension : supportedFormat.mediaType.extensions) { if (extension == detectedExtension) { return supportedFormat.id; } @@ -69,11 +69,11 @@ MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForURL(const hifi::URL& url) co return INVALID_ID; } -MIMETypeLibrary::ID MIMETypeLibrary::findMIMETypeForMediaType(const std::string& webMediaType) const { +MediaTypeLibrary::ID MediaTypeLibrary::findMediaTypeForWebID(const std::string& webMediaType) const { // Check web media type if (webMediaType != "") { - for (auto& supportedFormat : _mimeTypes) { - for (auto& candidateWebMediaType : supportedFormat.mimeType.webMediaTypes) { + for (auto& supportedFormat : _mediaTypes) { + for (auto& candidateWebMediaType : supportedFormat.mediaType.webMediaTypes) { if (candidateWebMediaType == webMediaType) { return supportedFormat.id; } diff --git a/libraries/shared/src/shared/MIMETypeLibrary.h b/libraries/shared/src/shared/MediaTypeLibrary.h similarity index 57% rename from libraries/shared/src/shared/MIMETypeLibrary.h rename to libraries/shared/src/shared/MediaTypeLibrary.h index 5066e859fb..c87da01fa1 100644 --- a/libraries/shared/src/shared/MIMETypeLibrary.h +++ b/libraries/shared/src/shared/MediaTypeLibrary.h @@ -1,5 +1,5 @@ // -// MIMETypeLibrary.h +// MediaTypeLibrary.h // libraries/shared/src/shared // // Created by Sabrina Shanman on 2018/11/28. @@ -9,8 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_MIMETypeLibrary_h -#define hifi_MIMETypeLibrary_h +#ifndef hifi_MediaTypeLibrary_h +#define hifi_MediaTypeLibrary_h #include #include @@ -36,20 +36,20 @@ public: }; // A named file extension with a list of known ways to positively identify the file type -class MIMEType { +class MediaType { public: - MIMEType(const std::string& name) : + MediaType(const std::string& name) : name(name) { } - MIMEType() {}; - MIMEType(const MIMEType& mimeType) : - name(mimeType.name), - extensions(mimeType.extensions), - webMediaTypes(mimeType.webMediaTypes), - fileSignatures(mimeType.fileSignatures) { + MediaType() {}; + MediaType(const MediaType& mediaType) : + name(mediaType.name), + extensions(mediaType.extensions), + webMediaTypes(mediaType.webMediaTypes), + fileSignatures(mediaType.fileSignatures) { } - static MIMEType NONE; + static MediaType NONE; std::string name; std::vector extensions; @@ -57,34 +57,34 @@ public: std::vector fileSignatures; }; -class MIMETypeLibrary { +class MediaTypeLibrary { public: using ID = unsigned int; static const ID INVALID_ID { 0 }; - ID registerMIMEType(const MIMEType& mimeType); - void unregisterMIMEType(const ID& id); + ID registerMediaType(const MediaType& mediaType); + void unregisterMediaType(const ID& id); - MIMEType getMIMEType(const ID& id) const; + MediaType getMediaType(const ID& id) const; - ID findMIMETypeForData(const hifi::ByteArray& data) const; - ID findMIMETypeForURL(const hifi::URL& url) const; - ID findMIMETypeForMediaType(const std::string& webMediaType) const; + ID findMediaTypeForData(const hifi::ByteArray& data) const; + ID findMediaTypeForURL(const hifi::URL& url) const; + ID findMediaTypeForWebID(const std::string& webMediaType) const; protected: ID nextID { 1 }; class Entry { public: - Entry(const ID& id, const MIMEType& mimeType) : + Entry(const ID& id, const MediaType& mediaType) : id(id), - mimeType(mimeType) { + mediaType(mediaType) { } ID id; - MIMEType mimeType; + MediaType mediaType; }; - std::vector _mimeTypes; + std::vector _mediaTypes; }; -#endif // hifi_MIMETypeLibrary_h +#endif // hifi_MeidaTypeLibrary_h From 0d419d4dcfe2f5ce80174769191f5bba5c51270c Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 6 Dec 2018 17:16:15 -0800 Subject: [PATCH 46/70] Pass on dropFaceTracking flag in ScriptableAvatar::toByteArrayStateful() --- assignment-client/src/avatars/ScriptableAvatar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index bf5d87a6bf..bcc21116ec 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -26,7 +26,7 @@ ScriptableAvatar::ScriptableAvatar() { QByteArray ScriptableAvatar::toByteArrayStateful(AvatarDataDetail dataDetail, bool dropFaceTracking) { _globalPosition = getWorldPosition(); - return AvatarData::toByteArrayStateful(dataDetail); + return AvatarData::toByteArrayStateful(dataDetail, dropFaceTracking); } From 46017a70d1b01165eb3219a07344de6b8cd0c0f0 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 6 Dec 2018 17:18:55 -0800 Subject: [PATCH 47/70] remove unneeded files and add unity project files to gitignore --- .gitignore | 5 + .../Unity.PackageManagerUI.Editor.csproj | 402 ----------------- .../Unity.TextMeshPro.Editor.csproj | 403 ------------------ .../Unity.TextMeshPro.csproj | 400 ----------------- .../UnityEditor.StandardEvents.csproj | 359 ---------------- .../avatarExporter.unitypackage | Bin 2836 -> 2828 bytes .../unity-avatar-exporter.Editor.csproj | 386 ----------------- .../unity-avatar-exporter.sln | 44 -- 8 files changed, 5 insertions(+), 1994 deletions(-) delete mode 100644 tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj delete mode 100644 tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj delete mode 100644 tools/unity-avatar-exporter/Unity.TextMeshPro.csproj delete mode 100644 tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj delete mode 100644 tools/unity-avatar-exporter/unity-avatar-exporter.Editor.csproj delete mode 100644 tools/unity-avatar-exporter/unity-avatar-exporter.sln diff --git a/.gitignore b/.gitignore index 8d92fe770b..ef1a7b215e 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,8 @@ interface/resources/GPUCache/* # package lock file for JSDoc tool tools/jsdoc/package-lock.json + +# ignore unneeded unity project files for avatar exporter +tools/unity-avatar-exporter/Library +tools/unity-avatar-exporter/Packages +tools/unity-avatar-exporter/ProjectSettings diff --git a/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj b/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj deleted file mode 100644 index 69a90a40fc..0000000000 --- a/tools/unity-avatar-exporter/Unity.PackageManagerUI.Editor.csproj +++ /dev/null @@ -1,402 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D} - Library - Unity.PackageManagerUI.Editor - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework - v3.5 - Unity Full v3.5 - - Editor:5 - StandaloneWindows64:19 - 2018.2.18f1 - - 4 - - - pdbonly - false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ - prompt - 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ - prompt - 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - - - - - - - - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll - - - C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll - - - C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll - - - C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll - - - C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj b/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj deleted file mode 100644 index e73e797cbe..0000000000 --- a/tools/unity-avatar-exporter/Unity.TextMeshPro.Editor.csproj +++ /dev/null @@ -1,403 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {3A848AB7-9891-EDDA-D555-BF184C2F81F4} - Library - Unity.TextMeshPro.Editor - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework - v3.5 - Unity Full v3.5 - - Editor:5 - StandaloneWindows64:19 - 2018.2.18f1 - - 4 - - - pdbonly - false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ - prompt - 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ - prompt - 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - - - - - - - - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll - - - C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll - - - C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll - - - C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll - - - C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll - - - - - {07A21C90-D344-AE1A-8456-9910C203B41A} - Unity.TextMeshPro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj b/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj deleted file mode 100644 index 971a6148b1..0000000000 --- a/tools/unity-avatar-exporter/Unity.TextMeshPro.csproj +++ /dev/null @@ -1,400 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {07A21C90-D344-AE1A-8456-9910C203B41A} - Library - Unity.TextMeshPro - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework - v3.5 - Unity Subset v3.5 - - Game:1 - StandaloneWindows64:19 - 2018.2.18f1 - - 4 - - - pdbonly - false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ - prompt - 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ - prompt - 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - - - - - - - - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll - - - C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll - - - C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll - - - C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll - - - C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\mscorlib.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Core.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Runtime.Serialization.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Xml.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\System.Xml.Linq.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\UnityScript.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\UnityScript.Lang.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity\Boo.Lang.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj b/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj deleted file mode 100644 index 6489fc514a..0000000000 --- a/tools/unity-avatar-exporter/UnityEditor.StandardEvents.csproj +++ /dev/null @@ -1,359 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {6800202F-4402-D405-F8CB-03DC7BD78B92} - Library - UnityEditor.StandardEvents - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework - v3.5 - Unity Full v3.5 - - Editor:5 - StandaloneWindows64:19 - 2018.2.18f1 - - 4 - - - pdbonly - false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ - prompt - 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ - prompt - 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - - - - - - - - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll - - - C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll - - - C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll - - - C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll - - - C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index afddc4498b7357fd9ebd188871140616118db852..e4f78ab6e99c8139e9192dcbf83574a94bafa823 100644 GIT binary patch delta 2522 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 Q^8YM<1L&^uivT_V0KfkAJpcdz diff --git a/tools/unity-avatar-exporter/unity-avatar-exporter.Editor.csproj b/tools/unity-avatar-exporter/unity-avatar-exporter.Editor.csproj deleted file mode 100644 index 8f91ea20bb..0000000000 --- a/tools/unity-avatar-exporter/unity-avatar-exporter.Editor.csproj +++ /dev/null @@ -1,386 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {C03F9C15-54AA-E5FF-7017-7CEBE37FC988} - Library - Assembly-CSharp-Editor - 512 - {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - .NETFramework - v3.5 - Unity Full v3.5 - - Editor:5 - StandaloneWindows64:19 - 2018.2.18f1 - - 4 - - - pdbonly - false - Temp\UnityVS_bin\Debug\ - Temp\UnityVS_obj\Debug\ - prompt - 4 - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - pdbonly - false - Temp\UnityVS_bin\Release\ - Temp\UnityVS_obj\Release\ - prompt - 4 - TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_18;UNITY_2018_2;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU - true - - - - - - - - - - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ARModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AccessibilityModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AnimationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.AudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.BaselibModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClothModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterInputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CoreModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.CrashReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.DirectorModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FacebookModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GameCenterModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.GridModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.HotReloadModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.IMGUIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ImageConversionModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.InputModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.LocalizationModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.PhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.Physics2DModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ProfilerModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StreamingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.SubstanceModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TLSModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TextRenderingModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TilemapModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.TimelineModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UIElementsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UNETModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UmbraModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityConnectModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VehiclesModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.VideoModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.WindModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.XRModule.dll - - - C:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll - - - C:\Program Files\Unity\Editor\Data\Managed/Unity.Locator.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/Editor/UnityEditor.TestRunner.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/UnityEngine.TestRunner.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/net35/unity-custom/nunit.framework.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TreeEditor/Editor/UnityEditor.TreeEditor.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/Editor/UnityEditor.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/Editor/UnityEditor.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll - - - C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityVR/Editor/UnityEditor.VR.dll - - - C:/Program Files/Unity/Editor/Data/Managed/UnityEditor.Graphs.dll - - - C:/Program Files/Unity/Editor/Data/PlaybackEngines/windowsstandalonesupport/UnityEditor.WindowsStandalone.Extensions.dll - - - C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/15.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.ads@2.0.8/Editor/UnityEditor.Advertisements.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/UnityEngine.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.analytics@2.0.16/Editor/UnityEditor.Analytics.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.purchasing@2.0.3/Editor/UnityEditor.Purchasing.dll - - - C:/Users/davidback/AppData/Local/Unity/cache/packages/packages.unity.com/com.unity.standardevents@1.0.13/UnityEngine.StandardEvents.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\mscorlib.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Core.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Runtime.Serialization.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Xml.Linq.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\UnityScript.Lang.dll - - - C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\Boo.Lang.dll - - - - - {6800202F-4402-D405-F8CB-03DC7BD78B92} - UnityEditor.StandardEvents - - - {3A848AB7-9891-EDDA-D555-BF184C2F81F4} - Unity.TextMeshPro.Editor - - - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D} - Unity.PackageManagerUI.Editor - - - {07A21C90-D344-AE1A-8456-9910C203B41A} - Unity.TextMeshPro - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/unity-avatar-exporter/unity-avatar-exporter.sln b/tools/unity-avatar-exporter/unity-avatar-exporter.sln deleted file mode 100644 index 9f608ed5c3..0000000000 --- a/tools/unity-avatar-exporter/unity-avatar-exporter.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2017 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro", "Unity.TextMeshPro.csproj", "{07A21C90-D344-AE1A-8456-9910C203B41A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.PackageManagerUI.Editor", "Unity.PackageManagerUI.Editor.csproj", "{6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro.Editor", "Unity.TextMeshPro.Editor.csproj", "{3A848AB7-9891-EDDA-D555-BF184C2F81F4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEditor.StandardEvents", "UnityEditor.StandardEvents.csproj", "{6800202F-4402-D405-F8CB-03DC7BD78B92}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "unity-avatar-exporter.Editor", "unity-avatar-exporter.Editor.csproj", "{C03F9C15-54AA-E5FF-7017-7CEBE37FC988}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {07A21C90-D344-AE1A-8456-9910C203B41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07A21C90-D344-AE1A-8456-9910C203B41A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07A21C90-D344-AE1A-8456-9910C203B41A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07A21C90-D344-AE1A-8456-9910C203B41A}.Release|Any CPU.Build.0 = Release|Any CPU - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6877705C-FBD9-0C4F-5AFB-6FB431E5D39D}.Release|Any CPU.Build.0 = Release|Any CPU - {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A848AB7-9891-EDDA-D555-BF184C2F81F4}.Release|Any CPU.Build.0 = Release|Any CPU - {6800202F-4402-D405-F8CB-03DC7BD78B92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6800202F-4402-D405-F8CB-03DC7BD78B92}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6800202F-4402-D405-F8CB-03DC7BD78B92}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6800202F-4402-D405-F8CB-03DC7BD78B92}.Release|Any CPU.Build.0 = Release|Any CPU - {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C03F9C15-54AA-E5FF-7017-7CEBE37FC988}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal From e5792aa85f50be800d01973bfbf565afcf5397c6 Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 7 Dec 2018 11:01:54 -0800 Subject: [PATCH 48/70] remove scene --- .../unity-avatar-exporter/Assets/Scenes.meta | 8 - .../Assets/Scenes/SampleScene.unity | 258 ------------------ .../Assets/Scenes/SampleScene.unity.meta | 7 - .../avatarExporter.unitypackage | Bin 2828 -> 2830 bytes 4 files changed, 273 deletions(-) delete mode 100644 tools/unity-avatar-exporter/Assets/Scenes.meta delete mode 100644 tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity delete mode 100644 tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta diff --git a/tools/unity-avatar-exporter/Assets/Scenes.meta b/tools/unity-avatar-exporter/Assets/Scenes.meta deleted file mode 100644 index 17072cfd6a..0000000000 --- a/tools/unity-avatar-exporter/Assets/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4f704ae4b4f98ae41a0bce26658850c1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity deleted file mode 100644 index 6511ad2971..0000000000 --- a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity +++ /dev/null @@ -1,258 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 10 - m_AtlasSize: 512 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 256 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &170076733 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 170076735} - - component: {fileID: 170076734} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &170076734 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 170076733} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 1 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &170076735 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 170076733} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &534669902 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 534669905} - - component: {fileID: 534669904} - - component: {fileID: 534669903} - m_Layer: 0 - m_Name: Main Camera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &534669903 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_Enabled: 1 ---- !u!20 &534669904 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &534669905 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta b/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta deleted file mode 100644 index 9531828bcd..0000000000 --- a/tools/unity-avatar-exporter/Assets/Scenes/SampleScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 99c9720ab356a0642a771bea13969a05 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index e4f78ab6e99c8139e9192dcbf83574a94bafa823..bb25cb4072569356c49f6eaf24d334a65827ec0e 100644 GIT binary patch literal 2830 zcmV+p3-R?KJ&rO1(Lk+8yQ@dLtJTWZ z4LZ|ax3`D8`}^Ig)9>%&!E@}8&NDLTI&IQ!?fm`HZui@JdwcMdMSG_8POsnY4*H!z z8|XUSUVE^E20KqsqLAZY2N3)}%SQX-FeKbs5RP{~wzNC#b@mr_SN8Aq`|W|Sf4{r; zYzIAwP5$ThpHY__vtWVwk0b~w^A1qAb`w$O0Bv%O+Kjml366w=9H5wlwGo-&$mNrT z&jL<@gBn6)2^9~!=hI(^&BFuq{sXi|Aqhs9;{yagq=&tTJjW$xctMJ7KjMI5k3;j$ zwtVuk$;d4q^SK9R+4=agY5li5gF^g=dS|=-pQ6as8@9#{z%27aCqN*M(FUu!q*S z#3KQAZKDHp$~^Xh%t65{3efu+f|786dvbV;s1%8V_$$yJ4A(^J z`8B#an_T|GY~IwdS8lyjGqV0%ry+qhTBp@B2_x|MtxI)kSS-6?gPQgo`LSHZFdp6c#a zG3NM8rZRv(2$whEiRNAvxd|<2>Q*piu!;<2pf2apVp@Vqw)d(SDsjo)ZWUXG%wQ>j zHjahlv}*PrGbUDFR@W#p>8m4|6esK+j^n{1mlF{9SwVP0Zc;+1nnV|K7K!t{BFcZ8 zl$VT%7?9Rq;IL$ZSH7=-gK8;J3M~0;KszJ$Ep*GL-tz-&IYz`$t$E0)WYL_!Wb9Tl zW^Q0IbxbBR?x^NG@Kp1ZL(D@@HD`v=nMjj9z1)d_dPKb8{Hu@U1Go@_S%9ZcHtT&rS(LK~Q zQm-kB#{k%95=Fjh522hj21z&!V~A5-rhkN0FAZfg9G5uA5GOy((LD~cRgexM1T?gz z@tM9hQa~SR*mQ`ZWmB=H=xi?X-D>sP|xw6AxE50VM;1RESL z`7u>rO@5*rf*>C+Ih=Hb9SjhavXx37BRgd%h}G9ZQS6~U2c7LhEw2^C$mp`Vjw%*L zx&I4S6`z}42SgmMLkStZSL?B$2mD}rmAFi1zT9OpdDaQIvCIh1XN|fwn=b3SLLpyv zie98%I9zcmR-^^#gYV*aM6t_m8uf7yFuCcyb_t+L^eJK(NK6+FXNlqk;rVSHFqyU) zmZd#DI^Tee1*$z%fs`yM#8v8{Ih|2(AP3#Sd#YKC7Bm#^vJ&D{xI#A~p&d{awdci#LzJnt z*f-S0ynt{H(RT`uQ|tp{kzNYOxz@bEQZP@GscwAV)yTCfG(zD0AZlcoBqGpBimZI! zK=X|LP*N(iB1{fT$fbh66DV_vRbQ-ncV}G&F|0J$S0mEMhHN4T!@9`bl6^>5i*@8U z4UMO%fQvs;#O6>epnj%HeaSqIsTY1v;)Z(rxBGF+<8n>{BKCWaAt5KVLop?I?8?}H zS!Lg!0<;wLq^LWe0=7JcJSpt13A@!&31AK@KO&)q;@XuU1(64NJAha~*jT0L?1~7g zh_#>=-cnz+cWRaE<4p?g8XXpTQf*%ktJ$p|$b#LG+%iS=XxXq2b5Pf2#4hc!04k2U zH3P!LG@?*6F*{lih`8F{ocSi%}i9Uf(b*qHVB)IU24eLh{S*P(Rm70Ujfvbd2WuS_qk!hq^1SG?_ zuFq^?n9Hp)IwJy!vCgIoT`|QdZ5M#_{2hIP>aBX&qRyBs^%XGt-O#ZQOS2INRKmpx zJ67q2{9FfX7V-<5h=q)A0zw?&+UyQoG@w9D`Kn_jENU)=xqXqloS1`0=WpN*AraGkXAs*te5G?~|>3*bCVZJfRP!{CmW0 z)D@y+YRF}_Jf78?`tbF7VaHk>Bz-w_cqrcvfoG+=x1^HCBpZWE!TkVdZPc!3PGG(X zF$`()Yg1R@z36GJf}3TbJ@vJ{| zA9nxipS}Ozd)6!7|L=9S_rIQ`thxWc$u(-?*3#y?{&1dwI6!|T&dLZVJ@x!RX0To% zC<6JLYbk`-k%*P&fdgVu8``KXxZcBIl8g8`8A0>*pAmeLvdPF#a{s@#XWakqZ}0y< gNzv~Aw~T9`JKM4?+p;a&^4~0f0Sl$rssKI!0NoC4l>h($ literal 2828 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 From 4cc5fc755f00ac6feedfeb7e44de31cf605c43c3 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 7 Dec 2018 11:42:03 -0800 Subject: [PATCH 49/70] Fix MS20208: Change an instance of 'ASSETS' to 'INVENTORY' --- interface/resources/qml/hifi/dialogs/security/Security.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/dialogs/security/Security.qml b/interface/resources/qml/hifi/dialogs/security/Security.qml index 5c52af1c05..a7a0d461a2 100644 --- a/interface/resources/qml/hifi/dialogs/security/Security.qml +++ b/interface/resources/qml/hifi/dialogs/security/Security.qml @@ -328,7 +328,7 @@ Rectangle { HifiStylesUit.RalewayRegular { text: "Your wallet is not set up.\n" + - "Open the ASSETS app to get started."; + "Open the INVENTORY app to get started."; // Anchors anchors.fill: parent; // Text size From 7cbe3776f5b6e58793840bcecf16fc5354ecbd72 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 7 Dec 2018 11:47:32 -0800 Subject: [PATCH 50/70] Simplify serializer registration process --- interface/src/Application.cpp | 6 +-- libraries/fbx/src/FBXSerializer.cpp | 7 ++-- libraries/fbx/src/FBXSerializer.h | 4 +- libraries/fbx/src/GLTFSerializer.cpp | 7 ++-- libraries/fbx/src/GLTFSerializer.h | 5 +-- libraries/fbx/src/OBJSerializer.cpp | 7 ++-- libraries/fbx/src/OBJSerializer.h | 5 +-- .../hfm/src/hfm/FormatSerializerRegister.cpp | 29 +++++++++++++ .../hfm/src/hfm/FormatSerializerRegister.h | 35 ++++++++++++++++ libraries/hfm/src/hfm/HFMFormat.h | 25 ----------- libraries/hfm/src/hfm/HFMFormatRegistry.h | 3 +- libraries/hfm/src/hfm/HFMSerializer.h | 11 +++++ libraries/hfm/src/hfm/ModelFormatRegistry.cpp | 20 +++++++++ libraries/hfm/src/hfm/ModelFormatRegistry.h | 30 ++++++++++++++ .../src/model-networking/ModelCache.cpp | 9 ++++ .../src/model-networking/ModelCache.h | 1 + .../model-networking/ModelFormatRegistry.cpp | 41 ------------------- .../model-networking/ModelFormatRegistry.h | 32 --------------- .../src/model-networking/ModelLoader.cpp | 2 +- 19 files changed, 159 insertions(+), 120 deletions(-) create mode 100644 libraries/hfm/src/hfm/FormatSerializerRegister.cpp create mode 100644 libraries/hfm/src/hfm/FormatSerializerRegister.h delete mode 100644 libraries/hfm/src/hfm/HFMFormat.h create mode 100644 libraries/hfm/src/hfm/ModelFormatRegistry.cpp create mode 100644 libraries/hfm/src/hfm/ModelFormatRegistry.h delete mode 100644 libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp delete mode 100644 libraries/model-networking/src/model-networking/ModelFormatRegistry.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6ff8618918..1570b6fe95 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -101,7 +101,7 @@ #include #include #include -#include +#include #include #include #include @@ -884,7 +884,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { DependencyManager::set(NodeType::Agent, listenPort); DependencyManager::set(); DependencyManager::set(); - DependencyManager::set(); + DependencyManager::set(); // ModelFormatRegistry must be defined before ModelCache. See the ModelCache constructor. DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); @@ -2747,9 +2747,9 @@ Application::~Application() { DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); - DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); + DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index ccbda9af33..ac338407f4 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -33,7 +33,6 @@ #include #include -#include #include // TOOL: Uncomment the following line to enable the filtering of all the unkwnon fields of a node so we can break point easily while loading a model with problems... @@ -1834,14 +1833,16 @@ HFMModel* FBXSerializer::extractHFMModel(const QVariantHash& mapping, const QStr return hfmModelPtr; } -MediaType getFBXMediaType() { +MediaType FBXSerializer::getMediaType() const { MediaType mediaType("fbx"); mediaType.extensions.push_back("fbx"); mediaType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); return mediaType; } -std::shared_ptr FBXSerializer::FORMAT = std::make_shared>(getFBXMediaType()); +std::unique_ptr FBXSerializer::getFactory() const { + return std::make_unique>(); +} HFMModel::Pointer FBXSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { QBuffer buffer(const_cast(&data)); diff --git a/libraries/fbx/src/FBXSerializer.h b/libraries/fbx/src/FBXSerializer.h index e66a6b911a..a76fb8f9bf 100644 --- a/libraries/fbx/src/FBXSerializer.h +++ b/libraries/fbx/src/FBXSerializer.h @@ -28,7 +28,6 @@ #include "FBX.h" #include -#include #include #include @@ -97,7 +96,8 @@ class ExtractedMesh; class FBXSerializer : public HFMSerializer { public: - static std::shared_ptr FORMAT; + MediaType getMediaType() const override; + std::unique_ptr getFactory() const override; HFMModel* _hfmModel; /// Reads HFMModel from the supplied model and mapping data. diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index cfa2124c5d..e254a91eb0 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -34,7 +34,6 @@ #include #include "FBXSerializer.h" -#include bool GLTFSerializer::getStringVal(const QJsonObject& object, const QString& fieldname, QString& value, QMap& defined) { @@ -906,14 +905,16 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const QUrl& url) { return true; } -MediaType getGLTFMediaType() { +MediaType GLTFSerializer::getMediaType() const { MediaType mediaType("gltf"); mediaType.extensions.push_back("gltf"); mediaType.webMediaTypes.push_back("model/gltf+json"); return mediaType; } -std::shared_ptr GLTFSerializer::FORMAT = std::make_shared>(getGLTFMediaType()); +std::unique_ptr GLTFSerializer::getFactory() const { + return std::make_unique>(); +} HFMModel::Pointer GLTFSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index fffb192b5b..5fca77c4fd 100644 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -16,8 +16,6 @@ #include #include #include -#include -#include "FBXSerializer.h" struct GLTFAsset { @@ -704,7 +702,8 @@ struct GLTFFile { class GLTFSerializer : public QObject, public HFMSerializer { Q_OBJECT public: - static std::shared_ptr FORMAT; + MediaType getMediaType() const override; + std::unique_ptr getFactory() const override; HFMModel::Pointer read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url = QUrl()) override; private: diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/fbx/src/OBJSerializer.cpp index b85ca7ebca..9c92466565 100644 --- a/libraries/fbx/src/OBJSerializer.cpp +++ b/libraries/fbx/src/OBJSerializer.cpp @@ -28,7 +28,6 @@ #include #include "FBXSerializer.h" -#include #include #include @@ -652,13 +651,15 @@ done: return result; } -MediaType getOBJMediaType() { +MediaType OBJSerializer::getMediaType() const { MediaType mediaType("obj"); mediaType.extensions.push_back("obj"); return mediaType; } -std::shared_ptr OBJSerializer::FORMAT = std::make_shared>(getOBJMediaType()); +std::unique_ptr OBJSerializer::getFactory() const { + return std::make_unique>(); +} HFMModel::Pointer OBJSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { PROFILE_RANGE_EX(resource_parse, __FUNCTION__, 0xffff0000, nullptr); diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/fbx/src/OBJSerializer.h index cbf6ee3ce2..3723b0e569 100644 --- a/libraries/fbx/src/OBJSerializer.h +++ b/libraries/fbx/src/OBJSerializer.h @@ -14,8 +14,6 @@ #include #include -#include -#include "FBXSerializer.h" class OBJTokenizer { public: @@ -93,7 +91,8 @@ public: class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can make network requests. Q_OBJECT public: - static std::shared_ptr FORMAT; + MediaType getMediaType() const override; + std::unique_ptr getFactory() const; typedef QVector FaceGroup; QVector vertices; diff --git a/libraries/hfm/src/hfm/FormatSerializerRegister.cpp b/libraries/hfm/src/hfm/FormatSerializerRegister.cpp new file mode 100644 index 0000000000..09c858b79d --- /dev/null +++ b/libraries/hfm/src/hfm/FormatSerializerRegister.cpp @@ -0,0 +1,29 @@ +// +// FormatSerializerRegister.cpp +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/12/07. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "FormatSerializerRegister.h" + +#include "ModelFormatRegistry.h" + +namespace hfm { + +DoFormatSerializerRegister::DoFormatSerializerRegister(const MediaType& mediaType, std::unique_ptr factory) { + auto registry = DependencyManager::get(); + _mediaTypeID = registry->_hfmFormatRegistry.registerMediaType(mediaType, std::move(factory)); +} + +void DoFormatSerializerRegister::unregisterFormat() { + auto registry = DependencyManager::get(); + registry->_hfmFormatRegistry.unregisterMediaType(_mediaTypeID); + _mediaTypeID = hfm::FormatRegistry::INVALID_MEDIA_TYPE_ID; +} + +}; diff --git a/libraries/hfm/src/hfm/FormatSerializerRegister.h b/libraries/hfm/src/hfm/FormatSerializerRegister.h new file mode 100644 index 0000000000..5971d678c8 --- /dev/null +++ b/libraries/hfm/src/hfm/FormatSerializerRegister.h @@ -0,0 +1,35 @@ +// +// FormatSerializerRegister.h +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HFMFormat_h +#define hifi_HFMFormat_h + +#include "HFMFormatRegistry.h" +#include "HFMSerializer.h" + +namespace hfm { + // A helper class which allows early de-registration of a Serializer from ModelFormatRegistry + class FormatSerializerRegister { + public: + virtual void unregisterFormat() = 0; + }; + + class DoFormatSerializerRegister : public FormatSerializerRegister { + public: + DoFormatSerializerRegister(const MediaType& mediaType, std::unique_ptr factory); + + void unregisterFormat() override; + protected: + FormatRegistry::MediaTypeID _mediaTypeID { FormatRegistry::INVALID_MEDIA_TYPE_ID }; + }; +}; + +#endif // hifi_HFMFormat_h diff --git a/libraries/hfm/src/hfm/HFMFormat.h b/libraries/hfm/src/hfm/HFMFormat.h deleted file mode 100644 index 4430bca3f4..0000000000 --- a/libraries/hfm/src/hfm/HFMFormat.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// HFMFormat.h -// libraries/hfm/src/hfm -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_HFMFormat_h -#define hifi_HFMFormat_h - -#include "HFMFormatRegistry.h" - -namespace hfm { - class Format { - public: - virtual void registerFormat(FormatRegistry& registry) = 0; - virtual void unregisterFormat(FormatRegistry& registry) = 0; - }; -}; - -#endif // hifi_HFMFormat_h diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.h b/libraries/hfm/src/hfm/HFMFormatRegistry.h index 203c5f5743..a437e9ac37 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.h +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.h @@ -27,9 +27,10 @@ public: void unregisterMediaType(const MediaTypeID& id); std::shared_ptr getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; - std::shared_ptr getSerializerForMediaTypeID(MediaTypeID id) const; protected: + std::shared_ptr getSerializerForMediaTypeID(MediaTypeID id) const; + MediaTypeLibrary _mediaTypeLibrary; std::mutex _libraryLock; class SupportedFormat { diff --git a/libraries/hfm/src/hfm/HFMSerializer.h b/libraries/hfm/src/hfm/HFMSerializer.h index a8ff4a3fa0..868ec3dd45 100644 --- a/libraries/hfm/src/hfm/HFMSerializer.h +++ b/libraries/hfm/src/hfm/HFMSerializer.h @@ -15,6 +15,7 @@ #include #include "HFM.h" +#include namespace hfm { @@ -25,6 +26,16 @@ public: virtual std::shared_ptr get() = 0; }; + template + class SimpleFactory : public Factory { + std::shared_ptr get() override { + return std::make_shared(); + } + }; + + virtual MediaType getMediaType() const = 0; + virtual std::unique_ptr getFactory() const = 0; + virtual Model::Pointer read(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url = hifi::URL()) = 0; }; diff --git a/libraries/hfm/src/hfm/ModelFormatRegistry.cpp b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp new file mode 100644 index 0000000000..5520307a9b --- /dev/null +++ b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp @@ -0,0 +1,20 @@ +// +// ModelFormatRegistry.cpp +// libraries/model-networking/src/model-networking +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ModelFormatRegistry.h" + +std::unique_ptr ModelFormatRegistry::addFormat(const hfm::Serializer& serializer) { + return std::make_unique(serializer.getMediaType(), serializer.getFactory()); +} + +std::shared_ptr ModelFormatRegistry::getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { + return _hfmFormatRegistry.getSerializerForMediaType(data, url, webMediaType); +} diff --git a/libraries/hfm/src/hfm/ModelFormatRegistry.h b/libraries/hfm/src/hfm/ModelFormatRegistry.h new file mode 100644 index 0000000000..4116869390 --- /dev/null +++ b/libraries/hfm/src/hfm/ModelFormatRegistry.h @@ -0,0 +1,30 @@ +// +// ModelFormatRegistry.h +// libraries/hfm/src/hfm +// +// Created by Sabrina Shanman on 2018/11/30. +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ModelFormatRegistry_h +#define hifi_ModelFormatRegistry_h + +#include "FormatSerializerRegister.h" +#include "HFMFormatRegistry.h" + +#include + +class ModelFormatRegistry : public Dependency { +public: + std::unique_ptr addFormat(const hfm::Serializer& serializer); + std::shared_ptr getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; + +protected: + friend class hfm::DoFormatSerializerRegister; + hfm::FormatRegistry _hfmFormatRegistry; +}; + +#endif // hifi_ModelFormatRegistry_h diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 8dc483e43b..2c82401ad0 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -23,6 +23,10 @@ #include "ModelNetworkingLogging.h" #include #include +#include +#include +#include +#include Q_LOGGING_CATEGORY(trace_resource_parse_geometry, "trace.resource.parse.geometry") @@ -308,6 +312,11 @@ ModelCache::ModelCache() { const qint64 GEOMETRY_DEFAULT_UNUSED_MAX_SIZE = DEFAULT_UNUSED_MAX_SIZE; setUnusedResourceCacheSize(GEOMETRY_DEFAULT_UNUSED_MAX_SIZE); setObjectName("ModelCache"); + + auto modelFormatRegistry = DependencyManager::get(); + modelFormatRegistry->addFormat(FBXSerializer()); + modelFormatRegistry->addFormat(OBJSerializer()); + modelFormatRegistry->addFormat(GLTFSerializer()); } QSharedPointer ModelCache::createResource(const QUrl& url, const QSharedPointer& fallback, diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 1018bdecd5..5f583d82d9 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -21,6 +21,7 @@ #include "FBXSerializer.h" #include "TextureCache.h" #include "ModelLoader.h" +#include "hfm/FormatSerializerRegister.h" // Alias instead of derive to avoid copying diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp b/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp deleted file mode 100644 index 8adc4ea5d9..0000000000 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// -// ModelFormatRegistry.cpp -// libraries/model-networking/src/model-networking -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "ModelFormatRegistry.h" - -#include "FBXSerializer.h" -#include "OBJSerializer.h" -#include "GLTFSerializer.h" - -ModelFormatRegistry::ModelFormatRegistry() : hfm::FormatRegistry() { - addDefaultFormats(); -} - -void ModelFormatRegistry::addDefaultFormats() { - addFormat(FBXSerializer::FORMAT); - addFormat(OBJSerializer::FORMAT); - addFormat(GLTFSerializer::FORMAT); -} - -void ModelFormatRegistry::addFormat(const std::shared_ptr& format) { - format->registerFormat(*this); - { - std::lock_guard lock(_formatsLock); - formats.push_back(format); - } -} - -ModelFormatRegistry::~ModelFormatRegistry() { - for (auto& format : formats) { - format->unregisterFormat(*this); - } - formats.clear(); -} diff --git a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h b/libraries/model-networking/src/model-networking/ModelFormatRegistry.h deleted file mode 100644 index ec1ce79b43..0000000000 --- a/libraries/model-networking/src/model-networking/ModelFormatRegistry.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// ModelFormatRegistry.h -// libraries/model-networking/src/model-networking -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_ModelFormatRegistry_h -#define hifi_ModelFormatRegistry_h - -#include -#include - -#include - -class ModelFormatRegistry : public hfm::FormatRegistry, public Dependency { -public: - ModelFormatRegistry(); - ~ModelFormatRegistry(); - void addFormat(const std::shared_ptr& format); - -protected: - void addDefaultFormats(); - std::vector> formats; - std::mutex _formatsLock; -}; - -#endif // hifi_ModelFormatRegistry_h diff --git a/libraries/model-networking/src/model-networking/ModelLoader.cpp b/libraries/model-networking/src/model-networking/ModelLoader.cpp index 1ef8e8ae85..65314633c9 100644 --- a/libraries/model-networking/src/model-networking/ModelLoader.cpp +++ b/libraries/model-networking/src/model-networking/ModelLoader.cpp @@ -12,7 +12,7 @@ #include "ModelLoader.h" #include -#include "ModelFormatRegistry.h" +#include hfm::Model::Pointer ModelLoader::load(const hifi::ByteArray& data, const hifi::VariantHash& mapping, const hifi::URL& url, const std::string& webMediaType) const { From f2e69aec5ea22e0927652cd4c7ff5db8e58e6754 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 7 Dec 2018 13:41:33 -0800 Subject: [PATCH 51/70] Fix mac warning for OBJSerializer::getFactory not marked with override --- libraries/fbx/src/OBJSerializer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/fbx/src/OBJSerializer.h index 3723b0e569..c4f8025e66 100644 --- a/libraries/fbx/src/OBJSerializer.h +++ b/libraries/fbx/src/OBJSerializer.h @@ -92,7 +92,7 @@ class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can Q_OBJECT public: MediaType getMediaType() const override; - std::unique_ptr getFactory() const; + std::unique_ptr getFactory() const override; typedef QVector FaceGroup; QVector vertices; From 031085b3843700ee01ac42dc2eab9962ddfea6ec Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 7 Dec 2018 16:17:33 -0800 Subject: [PATCH 52/70] Remove now unused HFMSimpleFormat --- libraries/hfm/src/hfm/HFMSimpleFormat.h | 47 ------------------------- 1 file changed, 47 deletions(-) delete mode 100644 libraries/hfm/src/hfm/HFMSimpleFormat.h diff --git a/libraries/hfm/src/hfm/HFMSimpleFormat.h b/libraries/hfm/src/hfm/HFMSimpleFormat.h deleted file mode 100644 index 0ab6636e7d..0000000000 --- a/libraries/hfm/src/hfm/HFMSimpleFormat.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// HFMSimpleFormat.h -// libraries/hfm/src/hfm -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_HFMSimpleFormat_h -#define hifi_HFMSimpleFormat_h - -#include "HFMFormat.h" -#include "HFMSerializer.h" - -namespace hfm { - template - class SimpleFactory : public Serializer::Factory { - std::shared_ptr get() override { - return std::make_shared(); - } - }; - - template // T is an implementation of hfm::Serializer - class SimpleFormat : public Format { - public: - SimpleFormat(const MediaType& mediaType) : Format(), - _mediaType(mediaType) { - } - - void registerFormat(FormatRegistry& registry) override { - _mediaTypeID = registry.registerMediaType(_mediaType, std::make_unique>()); - } - - void unregisterFormat(FormatRegistry& registry) override { - registry.unregisterMediaType(_mediaTypeID); - _mediaTypeID = hfm::FormatRegistry::INVALID_MEDIA_TYPE_ID; - } - protected: - MediaType _mediaType; - hfm::FormatRegistry::MediaTypeID _mediaTypeID; - }; -}; - -#endif // hifi_HFMSimpleFormat_h From c1e2653526ee334e83cf8eee6b7e132abb893c47 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 8 Dec 2018 07:42:03 -0800 Subject: [PATCH 53/70] check for and break parenting loops in hasAncestorOfType, findAncestorOfType, isParentPathComplete --- libraries/shared/src/SpatiallyNestable.cpp | 52 +++++++++++++++------- libraries/shared/src/SpatiallyNestable.h | 8 ++-- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 97e20f5627..d704498143 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -748,6 +748,18 @@ const Transform SpatiallyNestable::getTransform() const { return result; } +void SpatiallyNestable::breakParentingLoop() const { + // someone created a loop. break it... + qCDebug(shared) << "Parenting loop detected: " << getID(); + SpatiallyNestablePointer _this = getThisPointer(); + _this->setParentID(QUuid()); + bool setPositionSuccess; + AACube aaCube = getQueryAACube(setPositionSuccess); + if (setPositionSuccess) { + _this->setWorldPosition(aaCube.calcCenter()); + } +} + const Transform SpatiallyNestable::getTransform(int jointIndex, bool& success, int depth) const { // this returns the world-space transform for this object. It finds its parent's transform (which may // cause this object's parent to query its parent, etc) and multiplies this object's local transform onto it. @@ -755,15 +767,7 @@ const Transform SpatiallyNestable::getTransform(int jointIndex, bool& success, i if (depth > MAX_PARENTING_CHAIN_SIZE) { success = false; - // someone created a loop. break it... - qCDebug(shared) << "Parenting loop detected: " << getID(); - SpatiallyNestablePointer _this = getThisPointer(); - _this->setParentID(QUuid()); - bool setPositionSuccess; - AACube aaCube = getQueryAACube(setPositionSuccess); - if (setPositionSuccess) { - _this->setWorldPosition(aaCube.calcCenter()); - } + breakParentingLoop(); return jointInWorldFrame; } @@ -1208,8 +1212,12 @@ AACube SpatiallyNestable::getQueryAACube() const { return result; } -bool SpatiallyNestable::hasAncestorOfType(NestableType nestableType) const { - bool success; +bool SpatiallyNestable::hasAncestorOfType(NestableType nestableType, int depth) const { + if (depth > MAX_PARENTING_CHAIN_SIZE) { + breakParentingLoop(); + return false; + } + if (nestableType == NestableType::Avatar) { QUuid parentID = getParentID(); if (parentID == AVATAR_SELF_ID) { @@ -1217,6 +1225,7 @@ bool SpatiallyNestable::hasAncestorOfType(NestableType nestableType) const { } } + bool success; SpatiallyNestablePointer parent = getParentPointer(success); if (!success || !parent) { return false; @@ -1226,11 +1235,14 @@ bool SpatiallyNestable::hasAncestorOfType(NestableType nestableType) const { return true; } - return parent->hasAncestorOfType(nestableType); + return parent->hasAncestorOfType(nestableType, depth + 1); } -const QUuid SpatiallyNestable::findAncestorOfType(NestableType nestableType) const { - bool success; +const QUuid SpatiallyNestable::findAncestorOfType(NestableType nestableType, int depth) const { + if (depth > MAX_PARENTING_CHAIN_SIZE) { + breakParentingLoop(); + return QUuid(); + } if (nestableType == NestableType::Avatar) { QUuid parentID = getParentID(); @@ -1239,6 +1251,7 @@ const QUuid SpatiallyNestable::findAncestorOfType(NestableType nestableType) con } } + bool success; SpatiallyNestablePointer parent = getParentPointer(success); if (!success || !parent) { return QUuid(); @@ -1248,7 +1261,7 @@ const QUuid SpatiallyNestable::findAncestorOfType(NestableType nestableType) con return parent->getID(); } - return parent->findAncestorOfType(nestableType); + return parent->findAncestorOfType(nestableType, depth + 1); } void SpatiallyNestable::getLocalTransformAndVelocities( @@ -1336,7 +1349,12 @@ void SpatiallyNestable::dump(const QString& prefix) const { } } -bool SpatiallyNestable::isParentPathComplete() const { +bool SpatiallyNestable::isParentPathComplete(int depth) const { + if (depth > MAX_PARENTING_CHAIN_SIZE) { + breakParentingLoop(); + return false; + } + static const QUuid IDENTITY; QUuid parentID = getParentID(); if (parentID.isNull() || parentID == IDENTITY) { @@ -1349,5 +1367,5 @@ bool SpatiallyNestable::isParentPathComplete() const { return false; } - return parent->isParentPathComplete(); + return parent->isParentPathComplete(depth + 1); } diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 03ed97afbd..aafcfa10eb 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -75,7 +75,7 @@ public: static QString nestableTypeToString(NestableType nestableType); - virtual bool isParentPathComplete() const; + virtual bool isParentPathComplete(int depth = 0) const; // world frame @@ -187,8 +187,8 @@ public: bool isParentIDValid() const { bool success = false; getParentPointer(success); return success; } virtual SpatialParentTree* getParentTree() const { return nullptr; } - bool hasAncestorOfType(NestableType nestableType) const; - const QUuid findAncestorOfType(NestableType nestableType) const; + bool hasAncestorOfType(NestableType nestableType, int depth = 0) const; + const QUuid findAncestorOfType(NestableType nestableType, int depth = 0) const; SpatiallyNestablePointer getParentPointer(bool& success) const; static SpatiallyNestablePointer findByID(QUuid id, bool& success); @@ -246,6 +246,8 @@ private: mutable bool _parentKnowsMe { false }; bool _isDead { false }; bool _queryAACubeIsPuffed { false }; + + void breakParentingLoop() const; }; From ead49e5f03acb79d3aae01e76673d3832e65c314 Mon Sep 17 00:00:00 2001 From: vladest Date: Sat, 8 Dec 2018 16:49:34 +0100 Subject: [PATCH 54/70] Added missed header --- interface/src/graphics/RenderEventHandler.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/graphics/RenderEventHandler.h b/interface/src/graphics/RenderEventHandler.h index 93f8b548d0..1c531adbad 100644 --- a/interface/src/graphics/RenderEventHandler.h +++ b/interface/src/graphics/RenderEventHandler.h @@ -10,6 +10,7 @@ #ifndef hifi_RenderEventHandler_h #define hifi_RenderEventHandler_h +#include #include #include #include "gl/OffscreenGLCanvas.h" @@ -49,4 +50,4 @@ private: bool event(QEvent* event) override; }; -#endif // #include hifi_RenderEventHandler_h \ No newline at end of file +#endif // #include hifi_RenderEventHandler_h From 8792824960aa9fc8774c4f85735d1296a8a6d0aa Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 10 Dec 2018 09:58:59 -0800 Subject: [PATCH 55/70] Remove FormatSerializerRegister as it is unused --- .../hfm/src/hfm/FormatSerializerRegister.cpp | 29 --------------- .../hfm/src/hfm/FormatSerializerRegister.h | 35 ------------------- libraries/hfm/src/hfm/ModelFormatRegistry.cpp | 4 +-- libraries/hfm/src/hfm/ModelFormatRegistry.h | 4 +-- .../src/model-networking/ModelCache.h | 1 - 5 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 libraries/hfm/src/hfm/FormatSerializerRegister.cpp delete mode 100644 libraries/hfm/src/hfm/FormatSerializerRegister.h diff --git a/libraries/hfm/src/hfm/FormatSerializerRegister.cpp b/libraries/hfm/src/hfm/FormatSerializerRegister.cpp deleted file mode 100644 index 09c858b79d..0000000000 --- a/libraries/hfm/src/hfm/FormatSerializerRegister.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// FormatSerializerRegister.cpp -// libraries/hfm/src/hfm -// -// Created by Sabrina Shanman on 2018/12/07. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "FormatSerializerRegister.h" - -#include "ModelFormatRegistry.h" - -namespace hfm { - -DoFormatSerializerRegister::DoFormatSerializerRegister(const MediaType& mediaType, std::unique_ptr factory) { - auto registry = DependencyManager::get(); - _mediaTypeID = registry->_hfmFormatRegistry.registerMediaType(mediaType, std::move(factory)); -} - -void DoFormatSerializerRegister::unregisterFormat() { - auto registry = DependencyManager::get(); - registry->_hfmFormatRegistry.unregisterMediaType(_mediaTypeID); - _mediaTypeID = hfm::FormatRegistry::INVALID_MEDIA_TYPE_ID; -} - -}; diff --git a/libraries/hfm/src/hfm/FormatSerializerRegister.h b/libraries/hfm/src/hfm/FormatSerializerRegister.h deleted file mode 100644 index 5971d678c8..0000000000 --- a/libraries/hfm/src/hfm/FormatSerializerRegister.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// FormatSerializerRegister.h -// libraries/hfm/src/hfm -// -// Created by Sabrina Shanman on 2018/11/30. -// Copyright 2018 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_HFMFormat_h -#define hifi_HFMFormat_h - -#include "HFMFormatRegistry.h" -#include "HFMSerializer.h" - -namespace hfm { - // A helper class which allows early de-registration of a Serializer from ModelFormatRegistry - class FormatSerializerRegister { - public: - virtual void unregisterFormat() = 0; - }; - - class DoFormatSerializerRegister : public FormatSerializerRegister { - public: - DoFormatSerializerRegister(const MediaType& mediaType, std::unique_ptr factory); - - void unregisterFormat() override; - protected: - FormatRegistry::MediaTypeID _mediaTypeID { FormatRegistry::INVALID_MEDIA_TYPE_ID }; - }; -}; - -#endif // hifi_HFMFormat_h diff --git a/libraries/hfm/src/hfm/ModelFormatRegistry.cpp b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp index 5520307a9b..b4d7c5849f 100644 --- a/libraries/hfm/src/hfm/ModelFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp @@ -11,8 +11,8 @@ #include "ModelFormatRegistry.h" -std::unique_ptr ModelFormatRegistry::addFormat(const hfm::Serializer& serializer) { - return std::make_unique(serializer.getMediaType(), serializer.getFactory()); +void ModelFormatRegistry::addFormat(const hfm::Serializer& serializer) { + _hfmFormatRegistry.registerMediaType(serializer.getMediaType(), std::move(serializer.getFactory())); } std::shared_ptr ModelFormatRegistry::getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { diff --git a/libraries/hfm/src/hfm/ModelFormatRegistry.h b/libraries/hfm/src/hfm/ModelFormatRegistry.h index 4116869390..1228465298 100644 --- a/libraries/hfm/src/hfm/ModelFormatRegistry.h +++ b/libraries/hfm/src/hfm/ModelFormatRegistry.h @@ -12,18 +12,16 @@ #ifndef hifi_ModelFormatRegistry_h #define hifi_ModelFormatRegistry_h -#include "FormatSerializerRegister.h" #include "HFMFormatRegistry.h" #include class ModelFormatRegistry : public Dependency { public: - std::unique_ptr addFormat(const hfm::Serializer& serializer); + void addFormat(const hfm::Serializer& serializer); std::shared_ptr getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const; protected: - friend class hfm::DoFormatSerializerRegister; hfm::FormatRegistry _hfmFormatRegistry; }; diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 5f583d82d9..1018bdecd5 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -21,7 +21,6 @@ #include "FBXSerializer.h" #include "TextureCache.h" #include "ModelLoader.h" -#include "hfm/FormatSerializerRegister.h" // Alias instead of derive to avoid copying From b960b66542d6c5faf55bf2296dbf1febe8c2dc8f Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 10 Dec 2018 11:10:29 -0800 Subject: [PATCH 56/70] Fix mac warning for std::move on temporary object --- libraries/hfm/src/hfm/ModelFormatRegistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/hfm/src/hfm/ModelFormatRegistry.cpp b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp index b4d7c5849f..d95453161a 100644 --- a/libraries/hfm/src/hfm/ModelFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/ModelFormatRegistry.cpp @@ -12,7 +12,7 @@ #include "ModelFormatRegistry.h" void ModelFormatRegistry::addFormat(const hfm::Serializer& serializer) { - _hfmFormatRegistry.registerMediaType(serializer.getMediaType(), std::move(serializer.getFactory())); + _hfmFormatRegistry.registerMediaType(serializer.getMediaType(), serializer.getFactory()); } std::shared_ptr ModelFormatRegistry::getSerializerForMediaType(const hifi::ByteArray& data, const hifi::URL& url, const std::string& webMediaType) const { From ed99da2165ab7c0938508e0525c13ec43eed4050 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Dec 2018 11:15:27 -0800 Subject: [PATCH 57/70] Fix MS20215: Fix incorrect display of unavailable items on Marketplace main page --- scripts/system/html/js/marketplacesInject.js | 40 +++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js index e3da1c2577..f1931192e4 100644 --- a/scripts/system/html/js/marketplacesInject.js +++ b/scripts/system/html/js/marketplacesInject.js @@ -251,19 +251,39 @@ $(this).closest('.col-xs-3').attr("class", 'col-xs-6'); var priceElement = $(this).find('.price'); - priceElement.css({ - "padding": "3px 5px", - "height": "40px", - "background": "linear-gradient(#00b4ef, #0093C5)", - "color": "#FFF", - "font-weight": "600", - "line-height": "34px" - }); + var available = true; + + if (priceElement.text() === 'invalidated' || + priceElement.text() === 'sold out' || + priceElement.text() === 'not for sale') { + available = false; + priceElement.css({ + "padding": "3px 5px 10px 5px", + "height": "40px", + "background": "linear-gradient(#a2a2a2, #fefefe)", + "color": "#000", + "font-weight": "600", + "line-height": "34px" + }); + } else { + priceElement.css({ + "padding": "3px 5px", + "height": "40px", + "background": "linear-gradient(#00b4ef, #0093C5)", + "color": "#FFF", + "font-weight": "600", + "line-height": "34px" + }); + } if (parseInt(cost) > 0) { priceElement.css({ "width": "auto" }); - priceElement.html(' ' + cost); + + if (available) { + priceElement.html(' ' + cost); + } + priceElement.css({ "min-width": priceElement.width() + 30 }); } }); From ef8b605e69765753e3912d598506978b78b632a1 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 3 Dec 2018 10:03:13 -0800 Subject: [PATCH 58/70] Add gradle wrapper to remove dependency on installed gradle --- android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + android/gradlew | 172 ++++++++++++++++++ android/gradlew.bat | 84 +++++++++ 4 files changed, 262 insertions(+) create mode 100644 android/gradle/wrapper/gradle-wrapper.jar create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100755 android/gradlew create mode 100755 android/gradlew.bat diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100755 index 0000000000..f9553162f1 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 79d89d823e7ce3096b3f17b86fc1efd7d6b361ff Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 22 Oct 2018 11:51:16 -0700 Subject: [PATCH 59/70] Fixes for building with Android NDK 18 --- android/app/build.gradle | 20 ++++++++++---------- android/app/src/main/AndroidManifest.xml | 1 - android/build.gradle | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index cbc31479ec..e3c6989baf 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,23 +139,23 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' - compile 'com.android.support:support-v4:26.1.0' - compile 'com.android.support:appcompat-v7:26.1.0' - compile 'com.android.support:support-vector-drawable:26.1.0' + api 'com.android.support:support-v4:26.1.0' + api 'com.android.support:appcompat-v7:26.1.0' + api 'com.android.support:support-vector-drawable:26.1.0' implementation 'com.android.support:appcompat-v7:26.1.0' - compile 'com.android.support:recyclerview-v7:26.1.0' - compile 'com.android.support:cardview-v7:26.1.0' + api 'com.android.support:recyclerview-v7:26.1.0' + api 'com.android.support:cardview-v7:26.1.0' - compile 'com.squareup.retrofit2:retrofit:2.4.0' - compile 'com.squareup.retrofit2:converter-gson:2.4.0' + api 'com.squareup.retrofit2:retrofit:2.4.0' + api 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.picasso:picasso:2.71828' - compile 'com.squareup.retrofit2:retrofit:2.4.0' - compile 'com.squareup.retrofit2:converter-gson:2.4.0' + api 'com.squareup.retrofit2:retrofit:2.4.0' + api 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.picasso:picasso:2.71828' - compile 'com.sothree.slidinguppanel:library:3.4.0' + api 'com.sothree.slidinguppanel:library:3.4.0' implementation fileTree(include: ['*.jar'], dir: 'libs') } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 57e708068f..2ff35b6c3e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - diff --git a/android/build.gradle b/android/build.gradle index e22c2d877f..771db089d0 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,7 +14,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.2.1' } } From 85046190670fc50dae7ba76659e2a2cab3908a45 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 3 Dec 2018 12:54:04 -0800 Subject: [PATCH 60/70] Dockerized build, updated build script, ndk18 --- .gitignore | 15 +- android/Dockerfile | 92 ++++++++++++ android/build.gradle | 4 +- android/build_android.sh | 4 + hifi_android.py | 286 ++++++++++++++++++++++++++++++++++++ hifi_singleton.py | 46 ++++++ hifi_utils.py | 124 ++++++++++++++++ hifi_vcpkg.py | 216 ++++++++++++++++++++++++++++ interface/src/Menu.cpp | 2 +- prebuild.py | 304 +++++++++------------------------------ 10 files changed, 848 insertions(+), 245 deletions(-) create mode 100644 android/Dockerfile create mode 100755 android/build_android.sh create mode 100644 hifi_android.py create mode 100644 hifi_singleton.py create mode 100644 hifi_utils.py create mode 100644 hifi_vcpkg.py diff --git a/.gitignore b/.gitignore index ef1a7b215e..09b58d71ef 100644 --- a/.gitignore +++ b/.gitignore @@ -17,10 +17,11 @@ Makefile local.properties android/gradle* android/.gradle -android/app/src/main/jniLibs -android/app/libs -android/app/src/main/res/values/libs.xml -android/app/src/main/assets/bundled +android/**/src/main/jniLibs +android/**/libs +android/**/src/main/res/values/libs.xml +android/**/src/main/assets +android/**/gradle* # VSCode # List taken from Github Global Ignores master@435c4d92 @@ -83,9 +84,6 @@ npm-debug.log # Android studio files *___jb_old___ -# Generated assets for Android -android/app/src/main/assets - # Resource binary file interface/compiledResources @@ -95,6 +93,9 @@ interface/resources/GPUCache/* # package lock file for JSDoc tool tools/jsdoc/package-lock.json +# Python compile artifacts +**/__pycache__ + # ignore unneeded unity project files for avatar exporter tools/unity-avatar-exporter/Library tools/unity-avatar-exporter/Packages diff --git a/android/Dockerfile b/android/Dockerfile new file mode 100644 index 0000000000..2a6943cbc2 --- /dev/null +++ b/android/Dockerfile @@ -0,0 +1,92 @@ +FROM openjdk:8 + +RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections + +RUN apt-get update && apt-get -y install \ + curl \ + gnupg \ + software-properties-common \ + unzip \ + - + +# --- Versions and Download paths +ENV ANDROID_HOME="/usr/local/android-sdk" \ + ANDROID_NDK_HOME="/usr/local/android-ndk" \ + ANDROID_SDK_HOME="/usr/local/android-sdk-home" \ + ANDROID_VERSION=26 \ + ANDROID_BUILD_TOOLS_VERSION=28.0.3 \ + ANDROID_NDK_VERSION=r18 + +ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \ + NDK_URL="https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip" + +# --- Android SDK +RUN mkdir -p "$ANDROID_HOME" "$ANDROID_SDK_HOME" && \ + cd "$ANDROID_HOME" && \ + curl -s -S -o sdk.zip -L "${SDK_URL}" && \ + unzip sdk.zip && \ + rm sdk.zip && \ + yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses + +# Install Android Build Tool and Libraries +RUN $ANDROID_HOME/tools/bin/sdkmanager --update +RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ + "platforms;android-${ANDROID_VERSION}" \ + "platform-tools" + +RUN chmod -R a+w "${ANDROID_HOME}" +RUN chmod -R a+w "${ANDROID_SDK_HOME}" + +# --- Android NDK +# download +RUN mkdir /usr/local/android-ndk-tmp && \ + cd /usr/local/android-ndk-tmp && \ + curl -s -S -o ndk.zip -L "${NDK_URL}" && \ + unzip -q ndk.zip && \ + mv ./android-ndk-${ANDROID_NDK_VERSION} ${ANDROID_NDK_HOME} && \ + cd ${ANDROID_NDK_HOME} && \ + rm -rf /usr/local/android-ndk-tmp + +ENV PATH ${PATH}:${ANDROID_NDK_HOME} + +RUN apt-get -y install \ + g++ \ + gcc \ + - + +# --- Gradle +ARG BUILD_UID=1001 +RUN useradd -ms /bin/bash -u $BUILD_UID jenkins +USER jenkins +WORKDIR /home/jenkins + +# Hifi dependencies +ENV HIFI_BASE="/home/jenkins/hifi_android" +ENV HIFI_ANDROID_PRECOMPILED="$HIFI_BASE/dependencies" +ENV HIFI_VCPKG_BASE="$HIFI_BASE/vcpkg" + +RUN mkdir "$HIFI_BASE" && \ + mkdir "$HIFI_VCPKG_BASE" && \ + mkdir "$HIFI_ANDROID_PRECOMPILED" + +RUN git clone https://github.com/jherico/hifi.git && \ + cd ~/hifi && \ + git checkout feature/build/gradle-wrapper + + +WORKDIR /home/jenkins/hifi + +RUN touch .test4 && \ + git fetch && git reset origin/feature/build/gradle-wrapper --hard + +RUN mkdir build + +# Pre-cache the vcpkg managed dependencies +WORKDIR /home/jenkins/hifi/build +RUN python3 ../prebuild.py --build-root `pwd` --android + +# Pre-cache the gradle dependencies +WORKDIR /home/jenkins/hifi/android +RUN ./gradlew -m tasks -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED +RUN ./gradlew extractDependencies -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED + diff --git a/android/build.gradle b/android/build.gradle index 771db089d0..8d03b9f6b3 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -392,7 +392,7 @@ task extractDependencies(dependsOn: verifyDependencyDownloads) { } // Copies the non Qt dependencies. Qt dependencies (primary libraries and plugins) are handled by the qtBundle task -task copyDependencies(dependsOn: [ extractDependencies ]) { +task copyDependencies() { doLast { packages.each { entry -> def packageName = entry.key @@ -414,7 +414,7 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { } } -task extractGvrBinaries(dependsOn: extractDependencies) { +task extractGvrBinaries() { doLast { def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries'); zipTree(new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries/sdk-audio-1.101.0.aar')).visit { element -> diff --git a/android/build_android.sh b/android/build_android.sh new file mode 100755 index 0000000000..f98bd1a4b2 --- /dev/null +++ b/android/build_android.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -xeuo pipefail +./gradlew -PHIFI_ANDROID_PRECOMPILED=${HIFI_ANDROID_PRECOMPILED} -PRELEASE_NUMBER=${RELEASE_NUMBER} -PRELEASE_TYPE=${RELEASE_TYPE} setupDependencies +./gradlew -PHIFI_ANDROID_PRECOMPILED=${HIFI_ANDROID_PRECOMPILED} -PRELEASE_NUMBER=${RELEASE_NUMBER} -PRELEASE_TYPE=${RELEASE_TYPE} app:${ANDROID_BUILD_TARGET} \ No newline at end of file diff --git a/hifi_android.py b/hifi_android.py new file mode 100644 index 0000000000..e3944cda9a --- /dev/null +++ b/hifi_android.py @@ -0,0 +1,286 @@ +import hifi_utils +import json +import os +import platform +import re +import shutil +import xml.etree.ElementTree as ET +import functools + +print = functools.partial(print, flush=True) + +ANDROID_PACKAGE_URL = 'https://hifi-public.s3.amazonaws.com/dependencies/android/' + +ANDROID_PACKAGES = { + 'qt' : { + 'file': 'qt-5.11.1_linux_armv8-libcpp_openssl_patched.tgz', + 'versionId': '3S97HBM5G5Xw9EfE52sikmgdN3t6C2MN', + 'checksum': 'aa449d4bfa963f3bc9a9dfe558ba29df', + }, + 'bullet': { + 'file': 'bullet-2.88_armv8-libcpp.tgz', + 'versionId': 'S8YaoED0Cl8sSb8fSV7Q2G1lQJSNDxqg', + 'checksum': '81642779ccb110f8c7338e8739ac38a0', + }, + 'draco': { + 'file': 'draco_armv8-libcpp.tgz', + 'versionId': '3.B.uBj31kWlgND3_R2xwQzT_TP6Dz_8', + 'checksum': '617a80d213a5ec69fbfa21a1f2f738cd', + }, + 'glad': { + 'file': 'glad_armv8-libcpp.zip', + 'versionId': 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY', + 'checksum': 'a8ee8584cf1ccd34766c7ddd9d5e5449', + }, + 'gvr': { + 'file': 'gvrsdk_v1.101.0.tgz', + 'versionId': 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r', + 'checksum': '57fd02baa069176ba18597a29b6b4fc7', + }, + 'nvtt': { + 'file': 'nvtt_armv8-libcpp.zip', + 'versionId': 'lmkBVR5t4UF1UUwMwEirnk9H_8Nt90IO', + 'checksum': 'eb46d0b683e66987190ed124aabf8910', + 'sharedLibFolder': 'lib', + 'includeLibs': ['libnvtt.so', 'libnvmath.so', 'libnvimage.so', 'libnvcore.so'] + }, + 'oculus': { + 'file': 'ovr_sdk_mobile_1.19.0.zip', + 'versionId': 's_RN1vlEvUi3pnT7WPxUC4pQ0RJBs27y', + 'checksum': '98f0afb62861f1f02dd8110b31ed30eb', + 'sharedLibFolder': 'VrApi/Libs/Android/arm64-v8a/Release', + 'includeLibs': ['libvrapi.so'] + }, + 'openssl': { + 'file': 'openssl-1.1.0g_armv8.tgz', + 'versionId': 'AiiPjmgUZTgNj7YV1EEx2lL47aDvvvAW', + 'checksum': 'cabb681fbccd79594f65fcc266e02f32' + }, + 'polyvox': { + 'file': 'polyvox_armv8-libcpp.tgz', + 'versionId': 'A2kbKiNhpIenGq23bKRRzg7IMAI5BI92', + 'checksum': 'dba88b3a098747af4bb169e9eb9af57e', + 'sharedLibFolder': 'lib', + 'includeLibs': ['Release/libPolyVoxCore.so', 'libPolyVoxUtil.so'], + }, + 'tbb': { + 'file': 'tbb-2018_U1_armv8_libcpp.tgz', + 'versionId': 'mrRbWnv4O4evcM1quRH43RJqimlRtaKB', + 'checksum': '20768f298f53b195e71b414b0ae240c4', + 'sharedLibFolder': 'lib/release', + 'includeLibs': ['libtbb.so', 'libtbbmalloc.so'], + }, + 'hifiAC': { + 'baseUrl': 'http://s3.amazonaws.com/hifi-public/dependencies/', + 'file': 'codecSDK-android_armv8-2.0.zip', + 'checksum': '1cbef929675818fc64c4101b72f84a6a' + }, + 'etc2comp': { + 'file': 'etc2comp-patched-armv8-libcpp.tgz', + 'versionId': 'bHhGECRAQR1vkpshBcK6ByNc1BQIM8gU', + 'checksum': '14b02795d774457a33bbc60e00a786bc' + }, + 'breakpad': { + 'file': 'breakpad.tgz', + 'versionId': '8VrYXz7oyc.QBxNia0BVJOUBvrFO61jI', + 'checksum': 'ddcb23df336b08017042ba4786db1d9e', + 'sharedLibFolder': 'lib', + 'includeLibs': {'libbreakpad_client.a'} + } +} + +ANDROID_PLATFORM_PACKAGES = { + 'Darwin' : { + 'qt': { + 'file': 'qt-5.11.1_osx_armv8-libcpp_openssl_patched.tgz', + 'versionId': 'OxBD7iKINv1HbyOXmAmDrBb8AF3N.Kup', + 'checksum': 'c83cc477c08a892e00c71764dca051a0' + }, + }, + 'Windows' : { + 'qt': { + 'file': 'qt-5.11.1_win_armv8-libcpp_openssl_patched.tgz', + 'versionId': 'JfWM0P_Mz5Qp0LwpzhrsRwN3fqlLSFeT', + 'checksum': '0582191cc55431aa4f660848a542883e' + }, + } +} + +QT5_DEPS = [ + 'Qt5Concurrent', + 'Qt5Core', + 'Qt5Gui', + 'Qt5Multimedia', + 'Qt5Network', + 'Qt5OpenGL', + 'Qt5Qml', + 'Qt5Quick', + 'Qt5QuickControls2', + 'Qt5QuickTemplates2', + 'Qt5Script', + 'Qt5ScriptTools', + 'Qt5Svg', + 'Qt5WebChannel', + 'Qt5WebSockets', + 'Qt5Widgets', + 'Qt5XmlPatterns', + # Android specific + 'Qt5AndroidExtras', + 'Qt5WebView', +] + +def getPlatformPackages(): + result = ANDROID_PACKAGES.copy() + system = platform.system() + if system in ANDROID_PLATFORM_PACKAGES: + platformPackages = ANDROID_PLATFORM_PACKAGES[system] + result = { **result, **platformPackages } + return result + +def getPackageUrl(package): + url = ANDROID_PACKAGE_URL + if 'baseUrl' in package: + url = package['baseUrl'] + url += package['file'] + if 'versionId' in package: + url += '?versionId=' + package['versionId'] + return url + +def copyAndroidLibs(packagePath, appPath): + androidPackages = getPlatformPackages() + jniPath = os.path.join(appPath, 'src/main/jniLibs/arm64-v8a') + if not os.path.isdir(jniPath): + os.makedirs(jniPath) + for packageName in androidPackages: + package = androidPackages[packageName] + if 'sharedLibFolder' in package: + sharedLibFolder = os.path.join(packagePath, packageName, package['sharedLibFolder']) + if 'includeLibs' in package: + for lib in package['includeLibs']: + sourceFile = os.path.join(sharedLibFolder, lib) + destFile = os.path.join(jniPath, os.path.split(lib)[1]) + if not os.path.isfile(destFile): + print("Copying {}".format(lib)) + shutil.copy(sourceFile, destFile) + +class QtPackager: + def __init__(self, appPath, qtRootPath): + self.appPath = appPath + self.qtRootPath = qtRootPath + self.jniPath = os.path.join(self.appPath, 'src/main/jniLibs/arm64-v8a') + self.assetPath = os.path.join(self.appPath, 'src/main/assets') + self.qtAssetPath = os.path.join(self.assetPath, '--Added-by-androiddeployqt--') + # Jars go into the qt library + self.jarPath = os.path.realpath(os.path.join(self.appPath, '../../libraries/qt/libs')) + self.xmlFile = os.path.join(self.appPath, 'src/main/res/values/libs.xml') + self.files = [] + self.features = [] + self.permissions = [] + + def copyQtDeps(self): + for lib in QT5_DEPS: + libfile = os.path.join(self.qtRootPath, "lib/lib{}.so".format(lib)) + if not os.path.exists(libfile): + continue + self.files.append(libfile) + androidDeps = os.path.join(self.qtRootPath, "lib/{}-android-dependencies.xml".format(lib)) + if not os.path.exists(androidDeps): + continue + + tree = ET.parse(androidDeps) + root = tree.getroot() + for item in root.findall('./dependencies/lib/depends/*'): + if (item.tag == 'lib') or (item.tag == 'bundled'): + relativeFilename = item.attrib['file'] + if (relativeFilename.startswith('qml')): + continue + filename = os.path.join(self.qtRootPath, relativeFilename) + self.files.extend(hifi_utils.recursiveFileList(filename)) + elif item.tag == 'jar' and 'bundling' in item.attrib and item.attrib['bundling'] == "1": + self.files.append(os.path.join(self.qtRootPath, item.attrib['file'])) + elif item.tag == 'permission': + self.permissions.append(item.attrib['name']) + elif item.tag == 'feature': + self.features.append(item.attrib['name']) + + def scanQmlImports(self): + qmlImportCommandFile = os.path.join(self.qtRootPath, 'bin/qmlimportscanner') + system = platform.system() + if 'Windows' == system: + qmlImportCommandFile += ".exe" + if not os.path.isfile(qmlImportCommandFile): + raise RuntimeError("Couldn't find qml import scanner") + qmlRootPath = hifi_utils.scriptRelative('interface/resources/qml') + qmlImportPath = os.path.join(self.qtRootPath, 'qml') + commandResult = hifi_utils.executeSubprocessCapture([ + qmlImportCommandFile, + '-rootPath', qmlRootPath, + '-importPath', qmlImportPath + ]) + qmlImportResults = json.loads(commandResult) + for item in qmlImportResults: + if 'path' not in item: + print("Warning: QML import could not be resolved in any of the import paths: {}".format(item['name'])) + continue + path = os.path.realpath(item['path']) + if not os.path.exists(path): + continue + basePath = path + if os.path.isfile(basePath): + basePath = os.path.dirname(basePath) + basePath = os.path.normcase(basePath) + if basePath.startswith(qmlRootPath): + continue + self.files.extend(hifi_utils.recursiveFileList(path)) + + def processFiles(self): + self.files = list(set(self.files)) + self.files.sort() + libsXmlRoot = ET.Element('resources') + qtLibsNode = ET.SubElement(libsXmlRoot, 'array', {'name':'qt_libs'}) + bundledLibsNode = ET.SubElement(libsXmlRoot, 'array', {'name':'bundled_in_lib'}) + bundledAssetsNode = ET.SubElement(libsXmlRoot, 'array', {'name':'bundled_in_assets'}) + libPrefix = 'lib' + for sourceFile in self.files: + if not os.path.isfile(sourceFile): + raise RuntimeError("Unable to find dependency file " + sourceFile) + relativePath = os.path.relpath(sourceFile, self.qtRootPath) + destinationFile = None + if relativePath.endswith('.so'): + garbledFileName = None + if relativePath.startswith(libPrefix): + garbledFileName = relativePath[4:] + p = re.compile(r'lib(Qt5.*).so') + m = p.search(garbledFileName) + if not m: + raise RuntimeError("Huh?") + libName = m.group(1) + ET.SubElement(qtLibsNode, 'item').text = libName + else: + garbledFileName = 'lib' + relativePath.replace('\\', '_'[0]) + value = "{}:{}".format(garbledFileName, relativePath).replace('\\', '/') + ET.SubElement(bundledLibsNode, 'item').text = value + destinationFile = os.path.join(self.jniPath, garbledFileName) + elif relativePath.startswith('jar'): + destinationFile = os.path.join(self.jarPath, relativePath[4:]) + else: + value = "--Added-by-androiddeployqt--/{}:{}".format(relativePath,relativePath).replace('\\', '/') + ET.SubElement(bundledAssetsNode, 'item').text = value + destinationFile = os.path.join(self.qtAssetPath, relativePath) + + destinationParent = os.path.realpath(os.path.dirname(destinationFile)) + if not os.path.isdir(destinationParent): + os.makedirs(destinationParent) + if not os.path.isfile(destinationFile): + shutil.copy(sourceFile, destinationFile) + + tree = ET.ElementTree(libsXmlRoot) + tree.write(self.xmlFile, 'UTF-8', True) + + def bundle(self): + if not os.path.isfile(self.xmlFile) or True: + self.copyQtDeps() + self.scanQmlImports() + self.processFiles() + + diff --git a/hifi_singleton.py b/hifi_singleton.py new file mode 100644 index 0000000000..692948c80b --- /dev/null +++ b/hifi_singleton.py @@ -0,0 +1,46 @@ +import os +import platform +import time + +try: + import fcntl +except ImportError: + fcntl = None + +# Used to ensure only one instance of the script runs at a time +class Singleton: + def __init__(self, path): + self.fh = None + self.windows = 'Windows' == platform.system() + self.path = path + + def __enter__(self): + success = False + while not success: + try: + if self.windows: + if os.path.exists(self.path): + os.unlink(self.path) + self.fh = os.open(self.path, os.O_CREAT | os.O_EXCL | os.O_RDWR) + else: + self.fh = open(self.path, 'x') + fcntl.lockf(self.fh, fcntl.LOCK_EX | fcntl.LOCK_NB) + success = True + except EnvironmentError as err: + if self.fh is not None: + if self.windows: + os.close(self.fh) + else: + self.fh.close() + self.fh = None + print("Couldn't aquire lock, retrying in 10 seconds") + time.sleep(10) + return self + + def __exit__(self, type, value, traceback): + if self.windows: + os.close(self.fh) + else: + fcntl.lockf(self.fh, fcntl.LOCK_UN) + self.fh.close() + os.unlink(self.path) \ No newline at end of file diff --git a/hifi_utils.py b/hifi_utils.py new file mode 100644 index 0000000000..f53258d4f6 --- /dev/null +++ b/hifi_utils.py @@ -0,0 +1,124 @@ +import os +import hashlib +import platform +import shutil +import ssl +import subprocess +import sys +import tarfile +import urllib +import urllib.request +import zipfile +import tempfile +import time +import functools + +print = functools.partial(print, flush=True) + +def scriptRelative(*paths): + scriptdir = os.path.dirname(os.path.realpath(sys.argv[0])) + result = os.path.join(scriptdir, *paths) + result = os.path.realpath(result) + result = os.path.normcase(result) + return result + + +def recursiveFileList(startPath): + result = [] + if os.path.isfile(startPath): + result.append(startPath) + elif os.path.isdir(startPath): + for dirName, subdirList, fileList in os.walk(startPath): + for fname in fileList: + result.append(os.path.realpath(os.path.join(startPath, dirName, fname))) + result.sort() + return result + + +def executeSubprocessCapture(processArgs): + processResult = subprocess.run(processArgs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if (0 != processResult.returncode): + raise RuntimeError('Call to "{}" failed.\n\narguments:\n{}\n\nstdout:\n{}\n\nstderr:\n{}'.format( + processArgs[0], + ' '.join(processArgs[1:]), + processResult.stdout.decode('utf-8'), + processResult.stderr.decode('utf-8'))) + return processResult.stdout.decode('utf-8') + +def executeSubprocess(processArgs, folder=None, env=None): + restoreDir = None + if folder != None: + restoreDir = os.getcwd() + os.chdir(folder) + + process = subprocess.Popen( + processArgs, stdout=sys.stdout, stderr=sys.stderr, env=env) + process.wait() + + if (0 != process.returncode): + raise RuntimeError('Call to "{}" failed.\n\narguments:\n{}\n'.format( + processArgs[0], + ' '.join(processArgs[1:]), + )) + + if restoreDir != None: + os.chdir(restoreDir) + + +def hashFile(file, hasher = hashlib.sha512()): + with open(file, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hasher.update(chunk) + return hasher.hexdigest() + +# Assumes input files are in deterministic order +def hashFiles(filenames): + hasher = hashlib.sha256() + for filename in filenames: + with open(filename, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hasher.update(chunk) + return hasher.hexdigest() + +def hashFolder(folder): + filenames = recursiveFileList(folder) + return hashFiles(filenames) + +def downloadFile(url, hash=None, hasher=hashlib.sha512(), retries=3): + for i in range(retries): + tempFileName = None + # OSX Python doesn't support SSL, so we need to bypass it. + # However, we still validate the downloaded file's sha512 hash + if 'Darwin' == platform.system(): + tempFileDescriptor, tempFileName = tempfile.mkstemp() + context = ssl._create_unverified_context() + with urllib.request.urlopen(url, context=context) as response, open(tempFileDescriptor, 'wb') as tempFile: + shutil.copyfileobj(response, tempFile) + else: + tempFileName, headers = urllib.request.urlretrieve(url) + + # for some reason the hash we get back from the downloaded file is sometimes wrong if we check it right away + # but if we examine the file later, it is correct. + time.sleep(3) + downloadHash = hashFile(tempFileName, hasher) + # Verify the hash + if hash is not None and hash != downloadHash: + print("Try {}: Downloaded file {} hash {} does not match expected hash {} for url {}".format(i + 1, tempFileName, downloadHash, hash, url)) + os.remove(tempFileName) + continue + + return tempFileName + + raise RuntimeError("Downloaded file hash {} does not match expected hash {} for\n{}".format(downloadHash, hash, url)) + + +def downloadAndExtract(url, destPath, hash=None, hasher=hashlib.sha512(), isZip=False): + tempFileName = downloadFile(url, hash, hasher) + if isZip: + with zipfile.ZipFile(tempFileName) as zip: + zip.extractall(destPath) + else: + # Extract the archive + with tarfile.open(tempFileName, 'r:gz') as tgz: + tgz.extractall(destPath) + os.remove(tempFileName) diff --git a/hifi_vcpkg.py b/hifi_vcpkg.py new file mode 100644 index 0000000000..5492109864 --- /dev/null +++ b/hifi_vcpkg.py @@ -0,0 +1,216 @@ +import hifi_utils +import hifi_android +import hashlib +import os +import platform +import re +import shutil +import tempfile +import json +import xml.etree.ElementTree as ET +import functools + +print = functools.partial(print, flush=True) + +# Encapsulates the vcpkg system +class VcpkgRepo: + CMAKE_TEMPLATE = """ +set(CMAKE_TOOLCHAIN_FILE "{}" CACHE FILEPATH "Toolchain file") +set(CMAKE_TOOLCHAIN_FILE_UNCACHED "{}") +set(VCPKG_INSTALL_ROOT "{}") +set(VCPKG_TOOLS_DIR "{}") +""" + + CMAKE_TEMPLATE_NON_ANDROID = """ +# If the cached cmake toolchain path is different from the computed one, exit +if(NOT (CMAKE_TOOLCHAIN_FILE_UNCACHED STREQUAL CMAKE_TOOLCHAIN_FILE)) + message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE has changed, please wipe the build directory and rerun cmake") +endif() +""" + + def __init__(self, args): + self.args = args + # our custom ports, relative to the script location + self.sourcePortsPath = args.ports_path + self.id = hifi_utils.hashFolder(self.sourcePortsPath)[:8] + self.configFilePath = os.path.join(args.build_root, 'vcpkg.cmake') + + # OS dependent information + system = platform.system() + + if self.args.vcpkg_root is not None: + self.path = args.vcpkg_root + else: + if 'Darwin' == system: + defaultBasePath = os.path.expanduser('~/hifi/vcpkg') + else: + defaultBasePath = os.path.join(tempfile.gettempdir(), 'hifi', 'vcpkg') + self.basePath = os.getenv('HIFI_VCPKG_BASE', defaultBasePath) + if self.basePath == defaultBasePath: + print("Warning: Environment variable HIFI_VCPKG_BASE not set, using {}".format(defaultBasePath)) + if self.args.android: + self.basePath = os.path.join(self.basePath, 'android') + if (not os.path.isdir(self.basePath)): + os.makedirs(self.basePath) + self.path = os.path.join(self.basePath, self.id) + + print("Using vcpkg path {}".format(self.path)) + lockDir, lockName = os.path.split(self.path) + lockName += '.lock' + if not os.path.isdir(lockDir): + os.makedirs(lockDir) + + self.lockFile = os.path.join(lockDir, lockName) + self.tagFile = os.path.join(self.path, '.id') + # A format version attached to the tag file... increment when you want to force the build systems to rebuild + # without the contents of the ports changing + self.version = 1 + self.tagContents = "{}_{}".format(self.id, self.version) + + if 'Windows' == system: + self.exe = os.path.join(self.path, 'vcpkg.exe') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-win32.tar.gz?versionId=YZYkDejDRk7L_hrK_WVFthWvisAhbDzZ' + self.vcpkgHash = '3e0ff829a74956491d57666109b3e6b5ce4ed0735c24093884317102387b2cb1b2cd1ff38af9ed9173501f6e32ffa05cc6fe6d470b77a71ca1ffc3e0aa46ab9e' + self.hostTriplet = 'x64-windows' + elif 'Darwin' == system: + self.exe = os.path.join(self.path, 'vcpkg') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-osx.tar.gz?versionId=_fhqSxjfrtDJBvEsQ8L_ODcdUjlpX9cc' + self.vcpkgHash = '519d666d02ef22b87c793f016ca412e70f92e1d55953c8f9bd4ee40f6d9f78c1df01a6ee293907718f3bbf24075cc35492fb216326dfc50712a95858e9cbcb4d' + self.hostTriplet = 'x64-osx' + else: + self.exe = os.path.join(self.path, 'vcpkg') + self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-linux.tar.gz?versionId=97Nazh24etEVKWz33XwgLY0bvxEfZgMU' + self.vcpkgHash = '6a1ce47ef6621e699a4627e8821ad32528c82fce62a6939d35b205da2d299aaa405b5f392df4a9e5343dd6a296516e341105fbb2dd8b48864781d129d7fba10d' + self.hostTriplet = 'x64-linux' + + if self.args.android: + self.triplet = 'arm64-android' + self.androidPackagePath = os.path.join(self.path, 'android') + else: + self.triplet = self.hostTriplet + + def upToDate(self): + # Prevent doing a clean if we've explcitly set a directory for vcpkg + if self.args.vcpkg_root is not None: + return True + + if self.args.force_build: + print("Force build, out of date") + return False + if not os.path.isfile(self.exe): + print("Exe file {} not found, out of date".format(self.exe)) + return False + if not os.path.isfile(self.tagFile): + print("Tag file {} not found, out of date".format(self.tagFile)) + return False + with open(self.tagFile, 'r') as f: + storedTag = f.read() + if storedTag != self.tagContents: + print("Tag file {} contents don't match computed tag {}, out of date".format(self.tagFile, self.tagContents)) + return False + return True + + def clean(self): + print("Cleaning vcpkg installation at {}".format(self.path)) + if os.path.isdir(self.path): + print("Removing {}".format(self.path)) + shutil.rmtree(self.path, ignore_errors=True) + + # Make sure the VCPKG prerequisites are all there. + def bootstrap(self): + if self.upToDate(): + return + + self.clean() + + downloadVcpkg = False + if self.args.force_bootstrap: + print("Forcing bootstrap") + downloadVcpkg = True + + if not downloadVcpkg and not os.path.isfile(self.exe): + print("Missing executable, boostrapping") + downloadVcpkg = True + + # Make sure we have a vcpkg executable + testFile = os.path.join(self.path, '.vcpkg-root') + if not downloadVcpkg and not os.path.isfile(testFile): + print("Missing {}, bootstrapping".format(testFile)) + downloadVcpkg = True + + if downloadVcpkg: + print("Fetching vcpkg from {} to {}".format(self.vcpkgUrl, self.path)) + hifi_utils.downloadAndExtract(self.vcpkgUrl, self.path, self.vcpkgHash) + + print("Replacing port files") + portsPath = os.path.join(self.path, 'ports') + if (os.path.islink(portsPath)): + os.unlink(portsPath) + if (os.path.isdir(portsPath)): + shutil.rmtree(portsPath, ignore_errors=True) + shutil.copytree(self.sourcePortsPath, portsPath) + + def run(self, commands): + actualCommands = [self.exe, '--vcpkg-root', self.path] + actualCommands.extend(commands) + print("Running command") + print(actualCommands) + hifi_utils.executeSubprocess(actualCommands, folder=self.path) + + def setupDependencies(self): + # Special case for android, grab a bunch of binaries + # FIXME remove special casing for android builds eventually + if self.args.android: + print("Installing Android binaries") + self.setupAndroidDependencies() + + print("Installing host tools") + self.run(['install', '--triplet', self.hostTriplet, 'hifi-host-tools']) + + # If not android, install the hifi-client-deps libraries + if not self.args.android: + print("Installing build dependencies") + self.run(['install', '--triplet', self.triplet, 'hifi-client-deps']) + + def cleanBuilds(self): + # Remove temporary build artifacts + builddir = os.path.join(self.path, 'buildtrees') + if os.path.isdir(builddir): + print("Wiping build trees") + shutil.rmtree(builddir, ignore_errors=True) + + def setupAndroidDependencies(self): + # vcpkg prebuilt + if not os.path.isdir(os.path.join(self.path, 'installed', 'arm64-android')): + dest = os.path.join(self.path, 'installed') + url = "https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-arm64-android.tar.gz" + # FIXME I don't know why the hash check frequently fails here. If you examine the file later it has the right hash + #hash = "832f82a4d090046bdec25d313e20f56ead45b54dd06eee3798c5c8cbdd64cce4067692b1c3f26a89afe6ff9917c10e4b601c118bea06d23f8adbfe5c0ec12bc3" + #hifi_utils.downloadAndExtract(url, dest, hash) + hifi_utils.downloadAndExtract(url, dest) + + def writeTag(self): + print("Writing tag {} to {}".format(self.tagContents, self.tagFile)) + with open(self.tagFile, 'w') as f: + f.write(self.tagContents) + + def writeConfig(self): + print("Writing cmake config to {}".format(self.configFilePath)) + # Write out the configuration for use by CMake + cmakeScript = os.path.join(self.path, 'scripts/buildsystems/vcpkg.cmake') + installPath = os.path.join(self.path, 'installed', self.triplet) + toolsPath = os.path.join(self.path, 'installed', self.hostTriplet, 'tools') + cmakeTemplate = VcpkgRepo.CMAKE_TEMPLATE + if not self.args.android: + cmakeTemplate += VcpkgRepo.CMAKE_TEMPLATE_NON_ANDROID + cmakeConfig = cmakeTemplate.format(cmakeScript, cmakeScript, installPath, toolsPath).replace('\\', '/') + with open(self.configFilePath, 'w') as f: + f.write(cmakeConfig) + + def cleanOldBuilds(self): + # FIXME because we have the base directory, and because a build will + # update the tag file on every run, we can scan the base dir for sub directories containing + # a tag file that is older than N days, and if found, delete the directory, recovering space + print("Not implemented") + + diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index e9a44b1e87..bbbd8db89f 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -802,7 +802,7 @@ Menu::Menu() { connect(action, &QAction::triggered, qApp, []() { std::thread(crash::newFault).join(); }); // Developer > Show Statistics - addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stats); + addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stats, 0, true); // Developer > Show Animation Statistics addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AnimStats); diff --git a/prebuild.py b/prebuild.py index b8cb2c96ae..a758dcbea2 100644 --- a/prebuild.py +++ b/prebuild.py @@ -1,5 +1,26 @@ #!python +# The prebuild script is intended to simplify life for developers and dev-ops. It's repsonsible for acquiring +# tools required by the build as well as dependencies on which we rely. +# +# By using this script, we can reduce the requirements for a developer getting started to: +# +# * A working C++ dev environment like visual studio, xcode, gcc, or clang +# * Qt +# * CMake +# * Python 3.x +# +# The function of the build script is to acquire, if not already present, all the other build requirements +# The build script should be idempotent. If you run it with the same arguments multiple times, that should +# have no negative impact on the subsequent build times (i.e. re-running the prebuild script should not +# trigger a header change that causes files to be rebuilt). Subsequent runs after the first run should +# execute quickly, determining that no work is to be done + +import hifi_singleton +import hifi_utils +import hifi_android +import hifi_vcpkg + import argparse import concurrent import hashlib @@ -9,252 +30,65 @@ import os import platform import shutil import ssl -import subprocess import sys -import tarfile +import re import tempfile import time -import urllib.request import functools print = functools.partial(print, flush=True) -def executeSubprocess(processArgs, folder=None, env=None): - restoreDir = None - if folder != None: - restoreDir = os.getcwd() - os.chdir(folder) - - process = subprocess.Popen( - processArgs, stdout=sys.stdout, stderr=sys.stderr, env=env) - process.wait() - - if (0 != process.returncode): - raise RuntimeError('Call to "{}" failed.\n\narguments:\n{}\n'.format( - processArgs[0], - ' '.join(processArgs[1:]), - )) - - if restoreDir != None: - os.chdir(restoreDir) - - -def hashFile(file): - hasher = hashlib.sha512() - with open(file, "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hasher.update(chunk) - return hasher.hexdigest() - - -def hashFolder(folder): - hasher = hashlib.sha256() - for dirName, subdirList, fileList in os.walk(folder): - for fname in fileList: - with open(os.path.join(folder, dirName, fname), "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hasher.update(chunk) - return hasher.hexdigest() - - -def downloadAndExtract(url, destPath, hash=None): - tempFileDescriptor, tempFileName = tempfile.mkstemp() - # OSX Python doesn't support SSL, so we need to bypass it. - # However, we still validate the downloaded file's sha512 hash - context = ssl._create_unverified_context() - with urllib.request.urlopen(url, context=context) as response, open(tempFileDescriptor, 'wb') as tempFile: - shutil.copyfileobj(response, tempFile) - - # Verify the hash - if hash and hash != hashFile(tempFileName): - raise RuntimeError("Downloaded file does not match hash") - - # Extract the archive - with tarfile.open(tempFileName, 'r:gz') as tgz: - tgz.extractall(destPath) - os.remove(tempFileName) - - -class VcpkgRepo: - def __init__(self): - global args - scriptPath = os.path.dirname(os.path.realpath(sys.argv[0])) - # our custom ports, relative to the script location - self.sourcePortsPath = os.path.join(scriptPath, 'cmake', 'ports') - # FIXME Revert to ports hash before release - self.id = hashFolder(self.sourcePortsPath)[:8] - # OS dependent information - system = platform.system() - - if args.vcpkg_root is not None: - print("override vcpkg path with " + args.vcpkg_root) - self.path = args.vcpkg_root - else: - if 'Darwin' == system: - defaultBasePath = os.path.expanduser('~/hifi/vcpkg') - else: - defaultBasePath = os.path.join(tempfile.gettempdir(), 'hifi', 'vcpkg') - basePath = os.getenv('HIFI_VCPKG_BASE', defaultBasePath) - if (not os.path.isdir(basePath)): - os.makedirs(basePath) - self.path = os.path.join(basePath, self.id) - - self.tagFile = os.path.join(self.path, '.id') - # A format version attached to the tag file... increment when you want to force the build systems to rebuild - # without the contents of the ports changing - self.version = 1 - self.tagContents = "{}_{}".format(self.id, self.version) - - print("prebuild path: " + self.path) - if 'Windows' == system: - self.exe = os.path.join(self.path, 'vcpkg.exe') - self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-win32.tar.gz?versionId=YZYkDejDRk7L_hrK_WVFthWvisAhbDzZ' - self.vcpkgHash = '3e0ff829a74956491d57666109b3e6b5ce4ed0735c24093884317102387b2cb1b2cd1ff38af9ed9173501f6e32ffa05cc6fe6d470b77a71ca1ffc3e0aa46ab9e' - self.hostTriplet = 'x64-windows' - elif 'Darwin' == system: - self.exe = os.path.join(self.path, 'vcpkg') - self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-osx.tar.gz?versionId=_fhqSxjfrtDJBvEsQ8L_ODcdUjlpX9cc' - self.vcpkgHash = '519d666d02ef22b87c793f016ca412e70f92e1d55953c8f9bd4ee40f6d9f78c1df01a6ee293907718f3bbf24075cc35492fb216326dfc50712a95858e9cbcb4d' - self.hostTriplet = 'x64-osx' - else: - self.exe = os.path.join(self.path, 'vcpkg') - self.vcpkgUrl = 'https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-linux.tar.gz?versionId=97Nazh24etEVKWz33XwgLY0bvxEfZgMU' - self.vcpkgHash = '6a1ce47ef6621e699a4627e8821ad32528c82fce62a6939d35b205da2d299aaa405b5f392df4a9e5343dd6a296516e341105fbb2dd8b48864781d129d7fba10d' - self.hostTriplet = 'x64-linux' - - if args.android: - self.triplet = 'arm64-android' - else: - self.triplet = self.hostTriplet - - def outOfDate(self): - global args - # Prevent doing a clean if we've explcitly set a directory for vcpkg - if args.vcpkg_root is not None: - return False - if args.force_build: - return True - print("Looking for tag file {}".format(self.tagFile)) - if not os.path.isfile(self.tagFile): - return True - with open(self.tagFile, 'r') as f: - storedTag = f.read() - print("Found stored tag {}".format(storedTag)) - if storedTag != self.tagContents: - print("Doesn't match computed tag {}".format(self.tagContents)) - return True - return False - - def clean(self): - cleanPath = self.path - print("Cleaning vcpkg installation at {}".format(cleanPath)) - if os.path.isdir(self.path): - print("Removing {}".format(cleanPath)) - shutil.rmtree(cleanPath, ignore_errors=True) - - def bootstrap(self): - global args - if self.outOfDate(): - self.clean() - - # don't download the vcpkg binaries if we're working with an explicit - # vcpkg directory (possibly a git checkout) - if args.vcpkg_root is None: - downloadVcpkg = False - if args.force_bootstrap: - print("Forcing bootstrap") - downloadVcpkg = True - - if not downloadVcpkg and not os.path.isfile(self.exe): - print("Missing executable, boostrapping") - downloadVcpkg = True - - # Make sure we have a vcpkg executable - testFile = os.path.join(self.path, '.vcpkg-root') - if not downloadVcpkg and not os.path.isfile(testFile): - print("Missing {}, bootstrapping".format(testFile)) - downloadVcpkg = True - - if downloadVcpkg: - print("Fetching vcpkg from {} to {}".format(self.vcpkgUrl, self.path)) - downloadAndExtract(self.vcpkgUrl, self.path, self.vcpkgHash) - - print("Replacing port files") - portsPath = os.path.join(self.path, 'ports') - if (os.path.islink(portsPath)): - os.unlink(portsPath) - if (os.path.isdir(portsPath)): - shutil.rmtree(portsPath, ignore_errors=True) - shutil.copytree(self.sourcePortsPath, portsPath) - - def downloadAndroidDependencies(self): - url = "https://hifi-public.s3.amazonaws.com/dependencies/vcpkg/vcpkg-arm64-android.tar.gz" - hash = "832f82a4d090046bdec25d313e20f56ead45b54dd06eee3798c5c8cbdd64cce4067692b1c3f26a89afe6ff9917c10e4b601c118bea06d23f8adbfe5c0ec12bc3" - dest = os.path.join(self.path, 'installed') - downloadAndExtract(url, dest, hash) - - def run(self, commands): - actualCommands = [self.exe, '--vcpkg-root', self.path] - actualCommands.extend(commands) - print("Running command") - print(actualCommands) - executeSubprocess(actualCommands, folder=self.path) - - def buildDependencies(self): - global args - print("Installing host tools") - self.run(['install', '--triplet', self.hostTriplet, 'hifi-host-tools']) - # Special case for android, grab a bunch of binaries - if args.android: - self.downloadAndroidDependencies() - return - - print("Installing build dependencies") - self.run(['install', '--triplet', self.triplet, 'hifi-client-deps']) - # Remove temporary build artifacts - builddir = os.path.join(self.path, 'buildtrees') - if os.path.isdir(builddir): - print("Wiping build trees") - shutil.rmtree(builddir, ignore_errors=True) - - def writeConfig(self): - global args - configFilePath = os.path.join(args.build_root, 'vcpkg.cmake') - print("Writing cmake config to {}".format(configFilePath)) - # Write out the configuration for use by CMake - cmakeScript = os.path.join(self.path, 'scripts/buildsystems/vcpkg.cmake') - installPath = os.path.join(self.path, 'installed', self.triplet) - toolsPath = os.path.join(self.path, 'installed', self.hostTriplet, 'tools') - cmakeTemplate = 'set(CMAKE_TOOLCHAIN_FILE "{}" CACHE FILEPATH "Toolchain file")\n' - cmakeTemplate += 'set(VCPKG_INSTALL_ROOT "{}" CACHE FILEPATH "vcpkg installed packages path")\n' - cmakeTemplate += 'set(VCPKG_TOOLS_DIR "{}" CACHE FILEPATH "vcpkg installed packages path")\n' - cmakeConfig = cmakeTemplate.format(cmakeScript, installPath, toolsPath).replace('\\', '/') - with open(configFilePath, 'w') as f: - f.write(cmakeConfig) - - def writeTag(self): - print("Writing tag {} to {}".format(self.tagContents, self.tagFile)) - with open(self.tagFile, 'w') as f: - f.write(self.tagContents) +def parse_args(): + # our custom ports, relative to the script location + defaultPortsPath = hifi_utils.scriptRelative('cmake', 'ports') + from argparse import ArgumentParser + parser = ArgumentParser(description='Prepare build dependencies.') + parser.add_argument('--android', action='store_true') + #parser.add_argument('--android', type=str) + parser.add_argument('--debug', action='store_true') + parser.add_argument('--force-bootstrap', action='store_true') + parser.add_argument('--force-build', action='store_true') + parser.add_argument('--vcpkg-root', type=str, help='The location of the vcpkg distribution') + parser.add_argument('--build-root', required=True, type=str, help='The location of the cmake build') + parser.add_argument('--ports-path', type=str, default=defaultPortsPath) + if True: + args = parser.parse_args() + else: + args = parser.parse_args(['--android', 'questInterface', '--build-root', 'C:/git/hifi/android/apps/questInterface/.externalNativeBuild/cmake/debug/arm64-v8a']) + return args def main(): - vcpkg = VcpkgRepo() - vcpkg.bootstrap() - vcpkg.buildDependencies() - vcpkg.writeConfig() - vcpkg.writeTag() + # Fixup env variables. Leaving `USE_CCACHE` on will cause scribe to fail to build + # VCPKG_ROOT seems to cause confusion on Windows systems that previously used it for + # building OpenSSL + removeEnvVars = ['VCPKG_ROOT', 'USE_CCACHE'] + for var in removeEnvVars: + if var in os.environ: + del os.environ[var] + args = parse_args() + # Only allow one instance of the program to run at a time + pm = hifi_vcpkg.VcpkgRepo(args) + with hifi_singleton.Singleton(pm.lockFile) as lock: + if not pm.upToDate(): + pm.bootstrap() + # Always write the tag, even if we changed nothing. This + # allows vcpkg to reclaim disk space by identifying directories with + # tags that haven't been touched in a long time + pm.writeTag() -from argparse import ArgumentParser -parser = ArgumentParser(description='Prepare build dependencies.') -parser.add_argument('--android', action='store_true') -parser.add_argument('--debug', action='store_true') -parser.add_argument('--force-bootstrap', action='store_true') -parser.add_argument('--force-build', action='store_true') -parser.add_argument('--vcpkg-root', type=str, help='The location of the vcpkg distribution') -parser.add_argument('--build-root', required=True, type=str, help='The location of the cmake build') + # Grab our required dependencies: + # * build host tools, like spirv-cross and scribe + # * build client dependencies like openssl and nvtt + pm.setupDependencies() -args = parser.parse_args() + # wipe out the build directories (after writing the tag, since failure + # here shouldn't invalidte the vcpkg install) + pm.cleanBuilds() + + # Write the vcpkg config to the build directory last + pm.writeConfig() + +print(sys.argv) main() - From 39cff4f5540903933881fc2647fa6bb9a5234890 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 4 Dec 2018 18:26:07 -0800 Subject: [PATCH 61/70] Update build notes --- BUILD_ANDROID.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md index 8c9263b6e7..c111e758b5 100644 --- a/BUILD_ANDROID.md +++ b/BUILD_ANDROID.md @@ -6,13 +6,8 @@ Building is currently supported on OSX, Windows and Linux platforms, but develop You will need the following tools to build Android targets. -* [Gradle](https://gradle.org/install/) * [Android Studio](https://developer.android.com/studio/index.html) -### Gradle - -Install gradle version 4.1 or higher. Following the instructions to install via [SDKMAN!](http://sdkman.io/install.html) is recommended. - ### Android Studio Download the Android Studio installer and run it. Once installed, at the welcome screen, click configure in the lower right corner and select SDK manager @@ -29,6 +24,8 @@ From the SDK Tools tab select the following * Android SDK Tools * NDK (even if you have the NDK installed separately) +Make sure the NDK installed version is 18 (or higher) + # Environment Setting up the environment for android builds requires some additional steps @@ -51,17 +48,17 @@ Enter the repository `android` directory `cd hifi/android` -Execute a gradle pre-build setup. This step should only need to be done once +Execute two gradle pre-build steps. This steps should only need to be done once, unless you're working on the Android dependencies -`gradle setupDependencies` +`./gradlew extractDependencies` +`./gradlew setupDependencies` # Building & Running * Open Android Studio * Choose _Open Existing Android Studio Project_ * Navigate to the `hifi` repository and choose the `android` folder and select _OK_ -* If Android Studio asks you if you want to use the Gradle wrapper, select cancel and tell it where your local gradle installation is. If you used SDKMAN to install gradle it will be located in `$HOME/.sdkman/candidates/gradle/current/` * From the _Build_ menu select _Make Project_ * Once the build completes, from the _Run_ menu select _Run App_ From 6e35867123adb83b7f23ea41a9120297c5faa1ab Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 10 Dec 2018 13:00:38 -0800 Subject: [PATCH 62/70] Updated message box. --- tools/nitpick/src/Test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/nitpick/src/Test.cpp b/tools/nitpick/src/Test.cpp index b1254a3c04..477ced068c 100644 --- a/tools/nitpick/src/Test.cpp +++ b/tools/nitpick/src/Test.cpp @@ -215,17 +215,17 @@ void Test::appendTestResultsToFile(TestResult testResult, QPixmap comparisonImag } void::Test::appendTestResultsToFile(QString testResultFilename, bool hasFailed) { - QString resultFolderPath; + QString resultFolderPath { _testResultsFolderPath }; if (hasFailed) { - resultFolderPath = _testResultsFolderPath + "/Failure_"; + resultFolderPath += "/Failure_"; ++_failureIndex; } else { - resultFolderPath = _testResultsFolderPath + "/Success_"; + resultFolderPath += "/Success_"; ++_successIndex; } if (!QFile::copy(testResultFilename, resultFolderPath)) { -//// QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + sourceFile + " to " + destinationFile); + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to copy " + testResultFilename + " to " + resultFolderPath); exit(-1); } } From ab6aeae91a1243f1cdb0ced38dde11f5a85173c4 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Dec 2018 13:01:28 -0800 Subject: [PATCH 63/70] Fix MS20161: Fix INVENTORY notification dot state --- scripts/system/commerce/wallet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index 3a8462c5cb..d472d8d071 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -578,7 +578,7 @@ function notificationDataProcessPageHistory(data) { var shouldShowDotUpdates = false; function notificationPollCallbackUpdates(updatesArray) { - shouldShowDotUpdates = shouldShowDotUpdates || updatesArray.length > 0; + shouldShowDotUpdates = updatesArray.length > 0; ui.messagesWaiting(shouldShowDotUpdates || shouldShowDotHistory); if (updatesArray.length > 0) { From 5cc00be801354d85b48f38d5028ff1f3bee77564 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 10 Dec 2018 13:10:59 -0800 Subject: [PATCH 64/70] Switch to shell script for docker encapsulation, forward env variables --- android/containerized_build.sh | 22 ++++++++++++++++++++++ android/{ => docker}/Dockerfile | 0 2 files changed, 22 insertions(+) create mode 100755 android/containerized_build.sh rename android/{ => docker}/Dockerfile (100%) diff --git a/android/containerized_build.sh b/android/containerized_build.sh new file mode 100755 index 0000000000..cd6f15a92e --- /dev/null +++ b/android/containerized_build.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -xeuo pipefail + +DOCKER_IMAGE_NAME="hifi_androidbuild" + +docker build --build-arg BUILD_UID=`id -u` -t "${DOCKER_IMAGE_NAME}" -f docker/Dockerfile docker + +docker run \ + --rm \ + --security-opt seccomp:unconfined \ + -v "${WORKSPACE}":/home/jenkins/hifi \ + -e "RELEASE_NUMBER=${RELEASE_NUMBER}" \ + -e "RELEASE_TYPE=${RELEASE_TYPE}" \ + -e "ANDROID_BUILD_TARGET=assembleDebug" \ + -e "CMAKE_BACKTRACE_URL=${CMAKE_BACKTRACE_URL}" \ + -e "CMAKE_BACKTRACE_TOKEN=${CMAKE_BACKTRACE_TOKEN}" \ + -e "CMAKE_BACKTRACE_SYMBOLS_TOKEN=${CMAKE_BACKTRACE_SYMBOLS_TOKEN}" \ + -e "GA_TRACKING_ID=${GA_TRACKING_ID}" \ + -e "GIT_PR_COMMIT=${GIT_PR_COMMIT}" \ + -e "VERSION_CODE=${VERSION_CODE}" \ + "${DOCKER_IMAGE_NAME}" \ + sh -c "./build_android.sh" diff --git a/android/Dockerfile b/android/docker/Dockerfile similarity index 100% rename from android/Dockerfile rename to android/docker/Dockerfile From 3b9777d5d5f21582de81de2e9af4394a15d0fa85 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Dec 2018 14:08:38 -0800 Subject: [PATCH 65/70] Fix MS4382: Add a lifetime to handshake particle effects to prevent persistence --- scripts/system/makeUserConnection.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/system/makeUserConnection.js b/scripts/system/makeUserConnection.js index 4b59f050c9..37d7d898bc 100644 --- a/scripts/system/makeUserConnection.js +++ b/scripts/system/makeUserConnection.js @@ -51,6 +51,7 @@ "emitterShouldTrail": 1, "isEmitting": 1, "lifespan": 3, + "lifetime": 5, "maxParticles": 1000, "particleRadius": 0.003, "polarStart": Math.PI / 2, @@ -82,6 +83,7 @@ "emitterShouldTrail": 1, "isEmitting": 1, "lifespan": 3.6, + "lifetime": 5, "maxParticles": 4000, "particleRadius": 0.048, "polarStart": 0, @@ -287,6 +289,11 @@ } function updateMakingConnection() { + if (!makingConnectionParticleEffect) { + particleEffectUpdateTimer = null; + return; + } + makingConnectionEmitRate = Math.max(makingConnectionEmitRate * MAKING_CONNECTION_DECAY_RATE, MAKING_CONNECTION_MINIMUM_EMIT_RATE); isMakingConnectionEmitting = true; @@ -302,6 +309,11 @@ } function updateParticleEffect() { + if (!particleEffect) { + particleEffectUpdateTimer = null; + return; + } + particleEmitRate = Math.max(PARTICLE_MINIMUM_EMIT_RATE, particleEmitRate * PARTICLE_DECAY_RATE); Entities.editEntity(particleEffect, { emitRate: particleEmitRate From 31d15127013b38e887e8ca3b912027ecab9c9b06 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 10 Dec 2018 16:12:23 -0800 Subject: [PATCH 66/70] Simplify url empty check in GeometryReader::run --- libraries/model-networking/src/model-networking/ModelCache.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 2c82401ad0..dfee4750f5 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -193,8 +193,7 @@ void GeometryReader::run() { return; } - QString urlname = _url.path().toLower(); - if (urlname.isEmpty() || _url.path().isEmpty()) { + if (_url.path().isEmpty()) { throw QString("url is invalid"); } From 79e9bff225f8af6db38a72d0aa833adb43b9f9ba Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 10 Dec 2018 16:18:11 -0800 Subject: [PATCH 67/70] Nest if statement for invalid id checking in hfm::FormatRegistry::getSerializerForMediaType --- libraries/hfm/src/hfm/HFMFormatRegistry.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp index 60606bc018..1328369cff 100644 --- a/libraries/hfm/src/hfm/HFMFormatRegistry.cpp +++ b/libraries/hfm/src/hfm/HFMFormatRegistry.cpp @@ -54,9 +54,9 @@ std::shared_ptr FormatRegistry::getSerializerForMediaType(const hifi id = _mediaTypeLibrary.findMediaTypeForData(data); if (id == INVALID_MEDIA_TYPE_ID) { id = _mediaTypeLibrary.findMediaTypeForURL(url); - } - if (id == INVALID_MEDIA_TYPE_ID) { - id = _mediaTypeLibrary.findMediaTypeForWebID(webMediaType); + if (id == INVALID_MEDIA_TYPE_ID) { + id = _mediaTypeLibrary.findMediaTypeForWebID(webMediaType); + } } } return getSerializerForMediaTypeID(id); From 17dcd8b87ade0c94aed111ac01266e090c2eeb10 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 11 Dec 2018 10:13:19 -0800 Subject: [PATCH 68/70] disable splash screen on android --- interface/src/graphics/GraphicsEngine.cpp | 2 ++ interface/src/graphics/GraphicsEngine.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/interface/src/graphics/GraphicsEngine.cpp b/interface/src/graphics/GraphicsEngine.cpp index 36bf3a1b97..c2137d3d97 100644 --- a/interface/src/graphics/GraphicsEngine.cpp +++ b/interface/src/graphics/GraphicsEngine.cpp @@ -56,9 +56,11 @@ void GraphicsEngine::initializeGPU(GLWidget* glwidget) { glwidget->makeCurrent(); _gpuContext = std::make_shared(); +#ifndef Q_OS_ANDROID _gpuContext->pushProgramsToSync(shader::allPrograms(), [this] { _programsCompiled.store(true); }, 1); +#endif DependencyManager::get()->setGPUContext(_gpuContext); } diff --git a/interface/src/graphics/GraphicsEngine.h b/interface/src/graphics/GraphicsEngine.h index 83e774a64f..f0b88d2459 100644 --- a/interface/src/graphics/GraphicsEngine.h +++ b/interface/src/graphics/GraphicsEngine.h @@ -86,7 +86,11 @@ protected: FrameTimingsScriptingInterface _frameTimingsScriptingInterface; std::shared_ptr _splashScreen { std::make_shared() }; +#ifndef Q_OS_ANDROID std::atomic _programsCompiled { false }; +#else + std::atomic _programsCompiled { true }; +#endif friend class Application; }; From 75ba1cb3c7729f090c7bc30f11fd028f229c91c1 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 11 Dec 2018 10:30:12 -0800 Subject: [PATCH 69/70] I forgot to clear dot immediately --- interface/resources/qml/hifi/commerce/wallet/Wallet.qml | 3 +++ scripts/system/commerce/wallet.js | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index eb4e1f7aa8..f8e2c9115b 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -100,6 +100,9 @@ Rectangle { console.log("Failed to get Available Updates", result.data.message); } else { exchangeMoneyButtonContainer.messagesWaiting = result.data.updates.length > 0; + if (!exchangeMoneyButtonContainer.messagesWaiting) { + sendToScript({method: 'clearShouldShowDotUpdates'}); + } } } } diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index d472d8d071..5c312b0ec5 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -536,6 +536,10 @@ function fromQml(message) { shouldShowDotHistory = false; ui.messagesWaiting(shouldShowDotUpdates || shouldShowDotHistory); break; + case 'clearShouldShowDotUpdates': + shouldShowDotUpdates = false; + ui.messagesWaiting(shouldShowDotUpdates || shouldShowDotHistory); + break; case 'http.request': // Handled elsewhere, don't log. break; From deaf3e8e44260be493cdf521641ff3d7eb6e7bb4 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 11 Dec 2018 11:06:13 -0800 Subject: [PATCH 70/70] adding option to disable teleportring --- .../dialogs/preferences/CheckBoxPreference.qml | 4 +++- .../tabletWindows/TabletPreferencesDialog.qml | 6 +++--- interface/src/avatar/MyAvatar.h | 5 +++++ interface/src/ui/PreferencesDialog.cpp | 17 +++++++++-------- .../controllers/controllerModules/teleport.js | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml b/interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml index f6f840bbe8..c4d5ec7272 100644 --- a/interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml +++ b/interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml @@ -16,10 +16,11 @@ import controlsUit 1.0 Preference { id: root height: spacer.height + Math.max(hifi.dimensions.controlLineHeight, checkBox.implicitHeight) - + property bool value: false Component.onCompleted: { checkBox.checked = preference.value; preference.value = Qt.binding(function(){ return checkBox.checked; }); + value = checkBox.checked; } function save() { @@ -47,6 +48,7 @@ Preference { onClicked: { Tablet.playSound(TabletEnums.ButtonClick); + value = checked; } anchors { diff --git a/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml b/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml index a5d7b23df6..846c0600e4 100644 --- a/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml +++ b/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml @@ -123,12 +123,12 @@ Item { } // Runtime customization of preferences. - var locomotionPreference = findPreference("VR Movement", "Teleporting only / Walking and teleporting"); + var locomotionPreference = findPreference("VR Movement", "Walking"); var flyingPreference = findPreference("VR Movement", "Jumping and flying"); if (locomotionPreference && flyingPreference) { - flyingPreference.visible = (locomotionPreference.value === 1); + flyingPreference.visible = locomotionPreference.value; locomotionPreference.valueChanged.connect(function () { - flyingPreference.visible = (locomotionPreference.value === 1); + flyingPreference.visible = locomotionPreference.value; }); } if (HMD.isHeadControllerAvailable("Oculus")) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 848107917a..b2381366bb 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -247,6 +247,7 @@ class MyAvatar : public Avatar { Q_PROPERTY(bool isInSittingState READ getIsInSittingState WRITE setIsInSittingState); Q_PROPERTY(MyAvatar::SitStandModelType userRecenterModel READ getUserRecenterModel WRITE setUserRecenterModel); Q_PROPERTY(bool isSitStandStateLocked READ getIsSitStandStateLocked WRITE setIsSitStandStateLocked); + Q_PROPERTY(bool allowTeleporting READ getAllowTeleporting) const QString DOMINANT_LEFT_HAND = "left"; const QString DOMINANT_RIGHT_HAND = "right"; @@ -559,6 +560,9 @@ public: void setUseAdvancedMovementControls(bool useAdvancedMovementControls) { _useAdvancedMovementControls.set(useAdvancedMovementControls); } + bool getAllowTeleporting() { return _allowTeleportingSetting.get(); } + void setAllowTeleporting(bool allowTeleporting) { _allowTeleportingSetting.set(allowTeleporting); } + bool getShowPlayArea() const { return _showPlayArea.get(); } void setShowPlayArea(bool showPlayArea) { _showPlayArea.set(showPlayArea); } @@ -1889,6 +1893,7 @@ private: Setting::Handle _userHeightSetting; Setting::Handle _flyingHMDSetting; Setting::Handle _avatarEntityCountSetting; + Setting::Handle _allowTeleportingSetting { "allowTeleporting", true }; std::vector> _avatarEntityIDSettings; std::vector> _avatarEntityDataSettings; }; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index d1fbe02759..27e51c3654 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -238,14 +238,15 @@ void setupPreferences() { static const QString VR_MOVEMENT{ "VR Movement" }; { - auto getter = [myAvatar]()->int { return myAvatar->useAdvancedMovementControls() ? 1 : 0; }; - auto setter = [myAvatar](int value) { myAvatar->setUseAdvancedMovementControls(value == 1); }; - auto preference = - new RadioButtonsPreference(VR_MOVEMENT, "Teleporting only / Walking and teleporting", getter, setter); - QStringList items; - items << "Teleporting only" << "Walking and teleporting"; - preference->setHeading("Movement mode"); - preference->setItems(items); + auto getter = [myAvatar]()->bool { return myAvatar->getAllowTeleporting(); }; + auto setter = [myAvatar](bool value) { myAvatar->setAllowTeleporting(value); }; + auto preference = new CheckPreference(VR_MOVEMENT, "Teleporting", getter, setter); + preferences->addPreference(preference); + } + { + auto getter = [myAvatar]()->bool { return myAvatar->useAdvancedMovementControls(); }; + auto setter = [myAvatar](bool value) { myAvatar->setUseAdvancedMovementControls(value); }; + auto preference = new CheckPreference(VR_MOVEMENT, "Walking", getter, setter); preferences->addPreference(preference); } { diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 44aa04b497..8770ae8dde 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -701,7 +701,7 @@ Script.include("/~/system/libraries/controllers.js"); }; this.isReady = function(controllerData, deltaTime) { - if (Window.interstitialModeEnabled && !Window.isPhysicsEnabled()) { + if ((Window.interstitialModeEnabled && !Window.isPhysicsEnabled()) || !MyAvatar.allowTeleporting) { return makeRunningValues(false, [], []); }