Merge branch 'master' of https://github.com/highfidelity/hifi into gltf_tangents

This commit is contained in:
raveenajain 2019-02-14 11:45:53 -08:00
commit e825be566d
19 changed files with 89 additions and 56 deletions

View file

@ -111,7 +111,7 @@ bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST); int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST);
newView.lodScaleFactor = powf(2.0f, lodLevelOffset); newView.lodScaleFactor = powf(2.0f, lodLevelOffset);
startNewTraversal(newView, root); startNewTraversal(newView, root, isFullScene);
// When the viewFrustum changed the sort order may be incorrect, so we re-sort // When the viewFrustum changed the sort order may be incorrect, so we re-sort
// and also use the opportunity to cull anything no longer in view // and also use the opportunity to cull anything no longer in view
@ -220,9 +220,10 @@ bool EntityTreeSendThread::addDescendantsToExtraFlaggedEntities(const QUuid& fil
return hasNewChild || hasNewDescendants; return hasNewChild || hasNewDescendants;
} }
void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) { void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root); DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, forceFirstPass);
// there are three types of traversal: // there are three types of traversal:
// //
// (1) FirstTime = at login --> find everything in view // (1) FirstTime = at login --> find everything in view

View file

@ -42,7 +42,7 @@ private:
bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root); void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root, bool forceFirstPass = false);
bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override; bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override;
void preDistributionProcessing() override; void preDistributionProcessing() override;

View file

@ -61,6 +61,7 @@ class Sound : public Resource {
public: public:
Sound(const QUrl& url, bool isStereo = false, bool isAmbisonic = false); Sound(const QUrl& url, bool isStereo = false, bool isAmbisonic = false);
Sound(const Sound& other) : Resource(other), _audioData(other._audioData), _numChannels(other._numChannels) {}
bool isReady() const { return (bool)_audioData; } bool isReady() const { return (bool)_audioData; }

View file

@ -193,7 +193,8 @@ DiffTraversal::DiffTraversal() {
_path.reserve(MIN_PATH_DEPTH); _path.reserve(MIN_PATH_DEPTH);
} }
DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) { DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
assert(root); assert(root);
// there are three types of traversal: // there are three types of traversal:
// //
@ -212,7 +213,7 @@ DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View
Type type; Type type;
// If usesViewFrustum changes, treat it as a First traversal // If usesViewFrustum changes, treat it as a First traversal
if (_completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) { if (forceFirstPass || _completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) {
type = Type::First; type = Type::First;
_currentView.viewFrustums = view.viewFrustums; _currentView.viewFrustums = view.viewFrustums;
_currentView.lodScaleFactor = view.lodScaleFactor; _currentView.lodScaleFactor = view.lodScaleFactor;

View file

@ -61,7 +61,7 @@ public:
DiffTraversal(); DiffTraversal();
Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root); Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root, bool forceFirstPass = false);
const View& getCurrentView() const { return _currentView; } const View& getCurrentView() const { return _currentView; }

View file

@ -2640,15 +2640,8 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts"; static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts";
foreach(const auto& property, jsonFilters.keys()) { if (jsonFilters[SERVER_SCRIPTS_PROPERTY] == EntityQueryFilterSymbol::NonDefault) {
if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) { return _serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS;
// check if this entity has a non-default value for serverScripts
if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) {
return true;
} else {
return false;
}
}
} }
// the json filter syntax did not match what we expected, return a match // the json filter syntax did not match what we expected, return a match

View file

@ -397,8 +397,6 @@ public:
bool isDefined() const { return _defined; } bool isDefined() const { return _defined; }
Texture(TextureUsageType usageType); Texture(TextureUsageType usageType);
Texture(const Texture& buf); // deep copy of the sysmem texture
Texture& operator=(const Texture& buf); // deep copy of the sysmem texture
~Texture(); ~Texture();
Stamp getStamp() const { return _stamp; } Stamp getStamp() const { return _stamp; }
@ -693,8 +691,10 @@ class TextureSource {
public: public:
TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {} TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {}
void setUrl(const QUrl& url) { _imageUrl = url; }
const QUrl& getUrl() const { return _imageUrl; } const QUrl& getUrl() const { return _imageUrl; }
const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; } const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; }
void setType(int type) { _type = type; }
int getType() const { return _type; } int getType() const { return _type; }
void resetTexture(gpu::TexturePointer texture); void resetTexture(gpu::TexturePointer texture);

View file

@ -121,6 +121,7 @@ public:
/// A texture map. /// A texture map.
class Texture { class Texture {
public: public:
QString id; QString id;
QString name; QString name;
QByteArray filename; QByteArray filename;

View file

@ -322,7 +322,7 @@ private:
void GeometryDefinitionResource::setExtra(void* extra) { void GeometryDefinitionResource::setExtra(void* extra) {
const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra); const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra);
_mapping = geometryExtra ? geometryExtra->mapping : QVariantHash(); _mapping = geometryExtra ? geometryExtra->mapping : QVariantHash();
_textureBaseUrl = resolveTextureBaseUrl(_url, geometryExtra ? geometryExtra->textureBaseUrl : QUrl()); _textureBaseUrl = geometryExtra ? resolveTextureBaseUrl(_url, geometryExtra->textureBaseUrl) : QUrl();
_combineParts = geometryExtra ? geometryExtra->combineParts : true; _combineParts = geometryExtra ? geometryExtra->combineParts : true;
} }

View file

@ -336,6 +336,7 @@ int networkTexturePointerMetaTypeId = qRegisterMetaType<QWeakPointer<NetworkText
NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) : NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
Resource(url), Resource(url),
Texture(),
_maxNumPixels(100) _maxNumPixels(100)
{ {
if (resourceTexture) { if (resourceTexture) {
@ -346,6 +347,7 @@ NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
NetworkTexture::NetworkTexture(const NetworkTexture& other) : NetworkTexture::NetworkTexture(const NetworkTexture& other) :
Resource(other), Resource(other),
Texture(other),
_type(other._type), _type(other._type),
_sourceChannel(other._sourceChannel), _sourceChannel(other._sourceChannel),
_currentlyLoadingResourceType(other._currentlyLoadingResourceType), _currentlyLoadingResourceType(other._currentlyLoadingResourceType),
@ -373,7 +375,12 @@ void NetworkTexture::setExtra(void* extra) {
_maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS; _maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS;
_sourceChannel = textureExtra ? textureExtra->sourceChannel : image::ColorChannel::NONE; _sourceChannel = textureExtra ? textureExtra->sourceChannel : image::ColorChannel::NONE;
if (_textureSource) {
_textureSource->setUrl(_url);
_textureSource->setType((int)_type);
} else {
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type); _textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type);
}
_lowestRequestedMipLevel = 0; _lowestRequestedMipLevel = 0;
auto fileNameLowercase = _url.fileName().toLower(); auto fileNameLowercase = _url.fileName().toLower();
@ -533,7 +540,6 @@ void NetworkTexture::makeRequest() {
} else { } else {
qWarning(networking) << "NetworkTexture::makeRequest() called while not in a valid state: " << _ktxResourceState; qWarning(networking) << "NetworkTexture::makeRequest() called while not in a valid state: " << _ktxResourceState;
} }
} }
void NetworkTexture::handleLocalRequestCompleted() { void NetworkTexture::handleLocalRequestCompleted() {

View file

@ -362,7 +362,6 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
resource->moveToThread(qApp->thread()); resource->moveToThread(qApp->thread());
connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize); connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize);
resourcesWithExtraHash.insert(extraHash, resource); resourcesWithExtraHash.insert(extraHash, resource);
removeUnusedResource(resource);
resource->ensureLoading(); resource->ensureLoading();
} }
} }
@ -404,7 +403,7 @@ void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource)
// If it doesn't fit or its size is unknown, remove it from the cache. // If it doesn't fit or its size is unknown, remove it from the cache.
if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) { if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) {
resource->setCache(nullptr); resource->setCache(nullptr);
removeResource(resource->getURL(), resource->getBytes()); removeResource(resource->getURL(), resource->getExtraHash(), resource->getBytes());
resetTotalResourceCounter(); resetTotalResourceCounter();
return; return;
} }
@ -443,7 +442,7 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
auto size = it.value()->getBytes(); auto size = it.value()->getBytes();
locker.unlock(); locker.unlock();
removeResource(it.value()->getURL(), size); removeResource(it.value()->getURL(), it.value()->getExtraHash(), size);
locker.relock(); locker.relock();
_unusedResourcesSize -= size; _unusedResourcesSize -= size;
@ -489,9 +488,13 @@ void ResourceCache::resetResourceCounters() {
emit dirty(); emit dirty();
} }
void ResourceCache::removeResource(const QUrl& url, qint64 size) { void ResourceCache::removeResource(const QUrl& url, size_t extraHash, qint64 size) {
QWriteLocker locker(&_resourcesLock); QWriteLocker locker(&_resourcesLock);
auto& resources = _resources[url];
resources.remove(extraHash);
if (resources.size() == 0) {
_resources.remove(url); _resources.remove(url);
}
_totalResourcesSize -= size; _totalResourcesSize -= size;
} }
@ -664,7 +667,7 @@ void Resource::allReferencesCleared() {
} else { } else {
if (_cache) { if (_cache) {
// remove from the cache // remove from the cache
_cache->removeResource(getURL(), getBytes()); _cache->removeResource(getURL(), getExtraHash(), getBytes());
_cache->resetTotalResourceCounter(); _cache->resetTotalResourceCounter();
} }

View file

@ -272,7 +272,7 @@ private:
friend class ScriptableResourceCache; friend class ScriptableResourceCache;
void reserveUnusedResource(qint64 resourceSize); void reserveUnusedResource(qint64 resourceSize);
void removeResource(const QUrl& url, qint64 size = 0); void removeResource(const QUrl& url, size_t extraHash, qint64 size = 0);
void resetTotalResourceCounter(); void resetTotalResourceCounter();
void resetUnusedResourceCounter(); void resetUnusedResourceCounter();
@ -419,6 +419,7 @@ public:
virtual void setExtra(void* extra) {}; virtual void setExtra(void* extra) {};
void setExtraHash(size_t extraHash) { _extraHash = extraHash; } void setExtraHash(size_t extraHash) { _extraHash = extraHash; }
size_t getExtraHash() const { return _extraHash; }
signals: signals:
/// Fired when the resource begins downloading. /// Fired when the resource begins downloading.

View file

@ -19,8 +19,8 @@ function(check_test name)
endfunction() endfunction()
if (BUILD_TOOLS) if (BUILD_TOOLS)
# Allow different tools for production builds # Allow different tools for stable builds
if (RELEASE_TYPE STREQUAL "PRODUCTION") if (STABLE_BUILD)
set(ALL_TOOLS set(ALL_TOOLS
udt-test udt-test
vhacd-util vhacd-util

View file

@ -27,13 +27,30 @@ void AWSInterface::createWebPageFromResults(const QString& testResults,
const QString& workingDirectory, const QString& workingDirectory,
QCheckBox* updateAWSCheckBox, QCheckBox* updateAWSCheckBox,
QLineEdit* urlLineEdit) { QLineEdit* urlLineEdit) {
_testResults = testResults;
_workingDirectory = workingDirectory; _workingDirectory = workingDirectory;
// Verify filename is in correct format
// For example `D:/tt/TestResults--2019-02-10_17-30-57(local)[DESKTOP-6BO62Q9].zip`
QStringList parts = testResults.split('/');
QString zipFilename = parts[parts.length() - 1];
QStringList zipFolderNameParts = zipFilename.split(QRegExp("[\\(\\)\\[\\]]"), QString::SkipEmptyParts);
if (!QRegularExpression("TestResults--\\d{4}(-\\d\\d){2}_\\d\\d(-\\d\\d){2}").match(zipFolderNameParts[0]).hasMatch() ||
!QRegularExpression("\\w").match(zipFolderNameParts[1]).hasMatch() || // build (local, build number or PR number)
!QRegularExpression("\\w").match(zipFolderNameParts[2]).hasMatch() // machine name
) {
QMessageBox::critical(0, "Filename is in wrong format", "'" + zipFilename + "' is not in nitpick format");
return;
}
_testResults = testResults;
_urlLineEdit = urlLineEdit; _urlLineEdit = urlLineEdit;
_urlLineEdit->setEnabled(false); _urlLineEdit->setEnabled(false);
extractTestFailuresFromZippedFolder(); QString zipFilenameWithoutExtension = zipFilename.split('.')[0];
extractTestFailuresFromZippedFolder(_workingDirectory + "/" + zipFilenameWithoutExtension);
createHTMLFile(); createHTMLFile();
if (updateAWSCheckBox->isChecked()) { if (updateAWSCheckBox->isChecked()) {
@ -44,14 +61,12 @@ void AWSInterface::createWebPageFromResults(const QString& testResults,
} }
} }
void AWSInterface::extractTestFailuresFromZippedFolder() { void AWSInterface::extractTestFailuresFromZippedFolder(const QString& folderName) {
// For a test results zip file called `D:/tt/TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ].zip` // 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]` // the folder will be called `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]`
// and, this folder will be in the working directory // and, this folder will be in the working directory
QStringList parts = _testResults.split('/'); if (QDir(folderName).exists()) {
QString zipFolderName = _workingDirectory + "/" + parts[parts.length() - 1].split('.')[0]; QDir dir = folderName;
if (QDir(zipFolderName).exists()) {
QDir dir = zipFolderName;
dir.removeRecursively(); dir.removeRecursively();
} }

View file

@ -30,7 +30,7 @@ public:
QCheckBox* updateAWSCheckBox, QCheckBox* updateAWSCheckBox,
QLineEdit* urlLineEdit); QLineEdit* urlLineEdit);
void extractTestFailuresFromZippedFolder(); void extractTestFailuresFromZippedFolder(const QString& folderName);
void createHTMLFile(); void createHTMLFile();
void startHTMLpage(QTextStream& stream); void startHTMLpage(QTextStream& stream);

View file

@ -40,7 +40,7 @@ Nitpick::Nitpick(QWidget* parent) : QMainWindow(parent) {
_ui.plainTextEdit->setReadOnly(true); _ui.plainTextEdit->setReadOnly(true);
setWindowTitle("Nitpick - v2.1.1"); setWindowTitle("Nitpick - v2.1.2");
} }
Nitpick::~Nitpick() { Nitpick::~Nitpick() {

View file

@ -835,11 +835,16 @@ void Test::createRecursiveScript(const QString& directory, bool interactiveMode)
<< endl; << endl;
textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl << endl; textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl << endl;
textStream << "if (typeof nitpick === 'undefined') nitpick = createNitpick(Script.resolvePath(\".\"));" << endl; // The 'depth' variable is used to signal when to start running the recursive scripts
textStream << "if (typeof testsRootPath === 'undefined') testsRootPath = nitpick.getTestsRootPath();" << endl << endl; textStream << "if (typeof depth === 'undefined') {" << endl;
textStream << " depth = 0;" << endl;
textStream << " nitpick = createNitpick(Script.resolvePath(\".\"));" << endl;
textStream << " testsRootPath = nitpick.getTestsRootPath();" << endl << endl;
textStream << " nitpick.enableRecursive();" << endl; textStream << " nitpick.enableRecursive();" << endl;
textStream << "nitpick.enableAuto();" << endl << endl; textStream << " nitpick.enableAuto();" << endl;
textStream << "} else {" << endl;
textStream << " depth++" << endl;
textStream << "}" << endl << endl;
// Now include the test scripts // Now include the test scripts
for (int i = 0; i < directories.length(); ++i) { for (int i = 0; i < directories.length(); ++i) {
@ -847,8 +852,9 @@ void Test::createRecursiveScript(const QString& directory, bool interactiveMode)
} }
textStream << endl; textStream << endl;
textStream << "if (typeof runningRecursive === 'undefined') {" << endl; textStream << "if (depth > 0) {" << endl;
textStream << " runningRecursive = true;" << endl; textStream << " depth--;" << endl;
textStream << "} else {" << endl;
textStream << " nitpick.runRecursive();" << endl; textStream << " nitpick.runRecursive();" << endl;
textStream << "}" << endl << endl; textStream << "}" << endl << endl;
@ -1091,7 +1097,7 @@ void Test::setTestRailCreateMode(TestRailCreateMode testRailCreateMode) {
void Test::createWebPage(QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) { void Test::createWebPage(QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) {
QString testResults = QFileDialog::getOpenFileName(nullptr, "Please select the zipped test results to update from", nullptr, QString testResults = QFileDialog::getOpenFileName(nullptr, "Please select the zipped test results to update from", nullptr,
"Zipped Test Results (*.zip)"); "Zipped Test Results (TestResults--*.zip)");
if (testResults.isNull()) { if (testResults.isNull()) {
return; return;
} }

View file

@ -554,7 +554,7 @@ void TestRunnerDesktop::evaluateResults() {
nitpick->startTestsEvaluation(false, true, _snapshotFolder, _branch, _user); nitpick->startTestsEvaluation(false, true, _snapshotFolder, _branch, _user);
} }
void TestRunnerDesktop::automaticTestRunEvaluationComplete(QString zippedFolder, int numberOfFailures) { void TestRunnerDesktop::automaticTestRunEvaluationComplete(const QString& zippedFolder, int numberOfFailures) {
addBuildNumberToResults(zippedFolder); addBuildNumberToResults(zippedFolder);
restoreHighFidelityAppDataFolder(); restoreHighFidelityAppDataFolder();
@ -580,14 +580,19 @@ void TestRunnerDesktop::automaticTestRunEvaluationComplete(QString zippedFolder,
_runNow->setEnabled(true); _runNow->setEnabled(true);
} }
void TestRunnerDesktop::addBuildNumberToResults(QString zippedFolderName) { void TestRunnerDesktop::addBuildNumberToResults(const QString& zippedFolderName) {
QString augmentedFilename; QString augmentedFilename { zippedFolderName };
if (!_runLatest->isChecked()) { if (!_runLatest->isChecked()) {
augmentedFilename = zippedFolderName.replace("local", getPRNumberFromURL(_url->text())); augmentedFilename.replace("local", getPRNumberFromURL(_url->text()));
} else { } else {
augmentedFilename = zippedFolderName.replace("local", _buildInformation.build); augmentedFilename.replace("local", _buildInformation.build);
}
if (!QFile::rename(zippedFolderName, augmentedFilename)) {
QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Could not rename '" + zippedFolderName + "' to '" + augmentedFilename);
exit(-1);
} }
QFile::rename(zippedFolderName, augmentedFilename);
} }
void TestRunnerDesktop::restoreHighFidelityAppDataFolder() { void TestRunnerDesktop::restoreHighFidelityAppDataFolder() {

View file

@ -61,8 +61,8 @@ public:
void runInterfaceWithTestScript(); void runInterfaceWithTestScript();
void evaluateResults(); void evaluateResults();
void automaticTestRunEvaluationComplete(QString zippedFolderName, int numberOfFailures); void automaticTestRunEvaluationComplete(const QString& zippedFolderName, int numberOfFailures);
void addBuildNumberToResults(QString zippedFolderName); void addBuildNumberToResults(const QString& zippedFolderName);
void copyFolder(const QString& source, const QString& destination); void copyFolder(const QString& source, const QString& destination);