From 133ba3a00ace552b88c6f3c699955074a6f7046b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 20 Sep 2013 17:40:15 -0700 Subject: [PATCH] Set normals based on indices, cache face models. --- interface/src/Application.cpp | 4 ++++ interface/src/avatar/BlendFace.cpp | 6 ++++-- interface/src/renderer/FBXReader.cpp | 13 ++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7be8582cdc..d90c82e6ca 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -208,6 +209,9 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _window->setMenuBar(Menu::getInstance()); _networkAccessManager = new QNetworkAccessManager(this); + QNetworkDiskCache* cache = new QNetworkDiskCache(_networkAccessManager); + cache->setCacheDirectory("interfaceCache"); + _networkAccessManager->setCache(cache); QRect available = desktop()->availableGeometry(); _window->resize(available.size()); diff --git a/interface/src/avatar/BlendFace.cpp b/interface/src/avatar/BlendFace.cpp index 15e70bef82..4bd0c0d7da 100644 --- a/interface/src/avatar/BlendFace.cpp +++ b/interface/src/avatar/BlendFace.cpp @@ -118,7 +118,9 @@ void BlendFace::setModelURL(const QUrl& url) { if (!url.isValid()) { return; } - _modelReply = Application::getInstance()->getNetworkAccessManager()->get(QNetworkRequest(url)); + QNetworkRequest request(url); + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + _modelReply = Application::getInstance()->getNetworkAccessManager()->get(request); connect(_modelReply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(handleModelDownloadProgress(qint64,qint64))); connect(_modelReply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleModelReplyError())); } @@ -163,7 +165,7 @@ void BlendFace::setRig(const fsMsgRig& rig) { } void BlendFace::handleModelDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - if (bytesReceived < bytesTotal) { + if (bytesReceived < bytesTotal && !_modelReply->isFinished()) { return; } diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index 8398ba2513..b23f7fee35 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -272,7 +272,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node) { if (object.properties.at(2) == "Mesh") { FBXGeometry mesh; - QVector vertices; + QVector normals; QVector polygonIndices; foreach (const FBXNode& data, object.children) { if (data.name == "Vertices") { @@ -284,12 +284,19 @@ FBXGeometry extractFBXGeometry(const FBXNode& node) { } else if (data.name == "LayerElementNormal") { foreach (const FBXNode& subdata, data.children) { if (subdata.name == "Normals") { - mesh.normals = createVec3Vector( - subdata.properties.at(0).value >()); + normals = createVec3Vector(subdata.properties.at(0).value >()); } } } } + + // the (base) normals correspond to the polygon indices, for some reason + mesh.normals.resize(mesh.vertices.size()); + for (int i = 0, n = polygonIndices.size(); i < n; i++) { + int index = polygonIndices.at(i); + mesh.normals[index < 0 ? (-index - 1) : index] = normals[i]; + } + // convert the polygons to quads and triangles for (const int* beginIndex = polygonIndices.constData(), *end = beginIndex + polygonIndices.size(); beginIndex != end; ) {