From 39cb5100a3f441b2b3e0fad16a83c5498853d005 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 12:23:22 -0700 Subject: [PATCH 01/44] Clear cache and restart first draft --- interface/src/Application.cpp | 13 +++++++++++++ interface/src/Application.h | 7 +++++++ interface/src/Menu.cpp | 1 + interface/src/Menu.h | 1 + interface/src/main.cpp | 10 ++++++++++ 5 files changed, 32 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 48fa53777d..6c140e8cbb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -697,6 +697,14 @@ void Application::cleanupBeforeQuit() { #endif } +void Application::emptyLocalCache() { + QNetworkDiskCache* cache = qobject_cast(NetworkAccessManager::getInstance().cache()); + if (cache) { + qDebug() << "DiskCacheEditor::clear(): Clearing disk cache."; + cache->clear(); + } +} + Application::~Application() { EntityTree* tree = _entities.getTree(); tree->lockForWrite(); @@ -2404,6 +2412,11 @@ void Application::cameraMenuChanged() { } } +void Application::clearCacheAndQuit() { + emptyLocalCache(); + exit(RESTART_CODE); +} + void Application::rotationModeChanged() { if (!Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) { _myAvatar->setHeadPitch(0); diff --git a/interface/src/Application.h b/interface/src/Application.h index 8dd987fbcd..c387d80380 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -91,6 +91,9 @@ class Node; class ProgramObject; class ScriptEngine; + +static int RESTART_CODE = 1000; + static const float NODE_ADDED_RED = 0.0f; static const float NODE_ADDED_GREEN = 1.0f; static const float NODE_ADDED_BLUE = 0.0f; @@ -450,6 +453,8 @@ public slots: void domainConnectionDenied(const QString& reason); void cameraMenuChanged(); + + void clearCacheAndQuit(); private slots: void clearDomainOctreeDetails(); @@ -495,6 +500,8 @@ private: void init(); void cleanupBeforeQuit(); + + void emptyLocalCache(); void update(float deltaTime); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9f49361f79..30d92f16dc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -127,6 +127,7 @@ Menu::Menu() { addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyPath, 0, addressManager.data(), SLOT(copyPath())); + addActionToQMenuAndActionHash(fileMenu, MenuOption::ClearCacheAndQuit, 0, qApp, SLOT(clearCacheAndQuit())); addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 043bb53a7f..17f429a3f2 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -160,6 +160,7 @@ namespace MenuOption { const QString CalibrateCamera = "Calibrate Camera"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; + const QString ClearCacheAndQuit = "Clear Cache and Quit"; const QString Collisions = "Collisions"; const QString Console = "Console..."; const QString ControlWithSpeech = "Control With Speech"; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index e591034fb5..bfa1d9d643 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -116,5 +117,14 @@ int main(int argc, const char* argv[]) { #endif qCDebug(interfaceapp, "Normal exit."); + + if (exitCode == RESTART_CODE) { + qCDebug(interfaceapp, "Interface restarting."); + QStringList arguments; + for (int i = 0; i < argc; ++i) { + arguments << argv[i]; + } + QProcess::startDetached(arguments[0], arguments); + } return exitCode; } From ed296850e22fd26b419baf723e0e9e2e53d31c03 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 12:24:45 -0700 Subject: [PATCH 02/44] Rename to clear cache and restart --- interface/src/Application.cpp | 2 +- interface/src/Application.h | 2 +- interface/src/Menu.cpp | 2 +- interface/src/Menu.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6c140e8cbb..522d16981c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2412,7 +2412,7 @@ void Application::cameraMenuChanged() { } } -void Application::clearCacheAndQuit() { +void Application::clearCacheAndRestart() { emptyLocalCache(); exit(RESTART_CODE); } diff --git a/interface/src/Application.h b/interface/src/Application.h index c387d80380..a4c584da50 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -454,7 +454,7 @@ public slots: void cameraMenuChanged(); - void clearCacheAndQuit(); + void clearCacheAndRestart(); private slots: void clearDomainOctreeDetails(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 30d92f16dc..7808840232 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -127,7 +127,7 @@ Menu::Menu() { addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyPath, 0, addressManager.data(), SLOT(copyPath())); - addActionToQMenuAndActionHash(fileMenu, MenuOption::ClearCacheAndQuit, 0, qApp, SLOT(clearCacheAndQuit())); + addActionToQMenuAndActionHash(fileMenu, MenuOption::ClearCacheAndRestart, 0, qApp, SLOT(clearCacheAndRestart())); addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 17f429a3f2..aa8e3f7a2a 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -160,7 +160,7 @@ namespace MenuOption { const QString CalibrateCamera = "Calibrate Camera"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; - const QString ClearCacheAndQuit = "Clear Cache and Quit"; + const QString ClearCacheAndRestart = "Clear Cache and Restart"; const QString Collisions = "Collisions"; const QString Console = "Console..."; const QString ControlWithSpeech = "Control With Speech"; From ee3a8b1b6e54d2f87fbb1df007faea64e69dbda6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 18:23:16 -0700 Subject: [PATCH 03/44] Clear resource caches instead of restarting --- interface/src/Application.cpp | 6 +++++- libraries/model/src/model/Skybox.cpp | 2 +- libraries/networking/src/ResourceCache.cpp | 10 ++++++++++ libraries/networking/src/ResourceCache.h | 5 +++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 522d16981c..78707410ed 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2414,7 +2414,11 @@ void Application::cameraMenuChanged() { void Application::clearCacheAndRestart() { emptyLocalCache(); - exit(RESTART_CODE); + + DependencyManager::get()->refreshAll(); + DependencyManager::get()->refreshAll(); + DependencyManager::get()->refreshAll(); + DependencyManager::get()->refreshAll(); } void Application::rotationModeChanged() { diff --git a/libraries/model/src/model/Skybox.cpp b/libraries/model/src/model/Skybox.cpp index 10199adda3..f403f59e30 100755 --- a/libraries/model/src/model/Skybox.cpp +++ b/libraries/model/src/model/Skybox.cpp @@ -101,7 +101,7 @@ void Skybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const Sky batch.setModelTransform(Transform()); // only for Mac batch.setPipeline(thePipeline); batch.setInputBuffer(gpu::Stream::POSITION, theBuffer, 0, 8); - batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); + //batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); batch.setInputFormat(theFormat); batch.setUniformTexture(0, skybox.getCubemap()); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 0b6e39b151..cee0dbecf6 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -44,10 +44,20 @@ ResourceCache::~ResourceCache() { } } +void ResourceCache::refreshAll() { + for (auto it = _resources.begin(); it != _resources.end(); ++it) { + if (!it.value().isNull()) { + it.value().data()->refresh(); + } + } +} + void ResourceCache::refresh(const QUrl& url) { QSharedPointer resource = _resources.value(url); if (!resource.isNull()) { resource->refresh(); + } else { + _resources.remove(url); } } diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index ebe2c6e684..b4b9f089c5 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -78,7 +78,8 @@ public: ResourceCache(QObject* parent = NULL); virtual ~ResourceCache(); - + + void refreshAll(); void refresh(const QUrl& url); public slots: @@ -110,7 +111,7 @@ protected: private: friend class Resource; - QHash > _resources; + QHash> _resources; int _lastLRUKey = 0; static int _requestLimit; From 90edf055f74ae36244c1a02c3119d61c7dfe6eae Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 18:00:07 -0700 Subject: [PATCH 04/44] Clear unused resources before refresh --- libraries/networking/src/ResourceCache.cpp | 39 +++++++++++++--------- libraries/networking/src/ResourceCache.h | 17 ++++------ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index cee0dbecf6..f3ed60c281 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -34,20 +34,17 @@ ResourceCache::ResourceCache(QObject* parent) : } ResourceCache::~ResourceCache() { - // the unused resources may themselves reference resources that will be added to the unused - // list on destruction, so keep clearing until there are no references left - while (!_unusedResources.isEmpty()) { - foreach (const QSharedPointer& resource, _unusedResources) { - resource->setCache(nullptr); - } - _unusedResources.clear(); - } + clearUnusedResource(); } void ResourceCache::refreshAll() { - for (auto it = _resources.begin(); it != _resources.end(); ++it) { - if (!it.value().isNull()) { - it.value().data()->refresh(); + // Clear all unused resources so we don't have to reload them + clearUnusedResource(); + + // Refresh all remaining resources in use + foreach (auto resource, _resources) { + if (!resource.isNull()) { + resource.data()->refresh(); } } } @@ -144,6 +141,17 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) { } } +void ResourceCache::clearUnusedResource() { + // the unused resources may themselves reference resources that will be added to the unused + // list on destruction, so keep clearing until there are no references left + while (!_unusedResources.isEmpty()) { + foreach (const QSharedPointer& resource, _unusedResources) { + resource->setCache(nullptr); + } + _unusedResources.clear(); + } +} + void ResourceCache::attemptRequest(Resource* resource) { auto sharedItems = DependencyManager::get(); if (_requestLimit <= 0) { @@ -271,11 +279,12 @@ void Resource::refresh() { } void Resource::allReferencesCleared() { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "allReferencesCleared"); - return; - } if (_cache) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "allReferencesCleared"); + return; + } + // create and reinsert new shared pointer QSharedPointer self(this, &Resource::allReferencesCleared); setSelf(self); diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index b4b9f089c5..4997826870 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -51,7 +51,7 @@ static const qint64 MAX_UNUSED_MAX_SIZE = 10 * BYTES_PER_GIGABYTES; class ResourceCacheSharedItems : public Dependency { SINGLETON_DEPENDENCY public: - QList > _pendingRequests; + QList> _pendingRequests; QList _loadingRequests; private: ResourceCacheSharedItems() { } @@ -86,10 +86,6 @@ public slots: void checkAsynchronousGets(); protected: - qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE; - qint64 _unusedResourcesSize = 0; - QMap > _unusedResources; - /// Loads a resource from the specified URL. /// \param fallback a fallback URL to load if the desired one is unavailable /// \param delayLoad if true, don't load the resource immediately; wait until load is first requested @@ -104,6 +100,7 @@ protected: void addUnusedResource(const QSharedPointer& resource); void removeUnusedResource(const QSharedPointer& resource); void reserveUnusedResource(qint64 resourceSize); + void clearUnusedResource(); static void attemptRequest(Resource* resource); static void requestCompleted(Resource* resource); @@ -119,7 +116,10 @@ private: void getResourceAsynchronously(const QUrl& url); QReadWriteLock _resourcesToBeGottenLock; QQueue _resourcesToBeGotten; - + + qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE; + qint64 _unusedResourcesSize = 0; + QMap> _unusedResources; }; /// Base class for resources. @@ -173,12 +173,10 @@ public: const QUrl& getURL() const { return _url; } signals: - /// Fired when the resource has been loaded. void loaded(); protected slots: - void attemptRequest(); /// Refreshes the resource if the last modified date on the network @@ -186,7 +184,6 @@ protected slots: void maybeRefresh(); protected: - virtual void init(); /// Called when the download has finished. The recipient should delete the reply when done with it. @@ -208,14 +205,12 @@ protected: QPointer _cache; private slots: - void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); void handleReplyError(); void handleReplyFinished(); void handleReplyTimeout(); private: - void setLRUKey(int lruKey) { _lruKey = lruKey; } void makeRequest(); From 6c591131ba32315b5fb2c3dfeac97e7d54bf6869 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 10 Jul 2015 12:01:51 -0700 Subject: [PATCH 05/44] Made Animations safe for resource reload --- .../src/avatars/ScriptableAvatar.cpp | 2 +- libraries/animation/src/AnimationCache.cpp | 4 +--- libraries/animation/src/AnimationCache.h | 3 --- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/entities/src/ModelEntityItem.cpp | 17 ++++++++++------- libraries/entities/src/ModelEntityItem.h | 2 +- libraries/networking/src/ResourceCache.cpp | 9 ++++----- libraries/networking/src/ResourceCache.h | 1 + libraries/render-utils/src/AnimationHandle.cpp | 11 ++++++++++- libraries/render-utils/src/AnimationHandle.h | 2 ++ 10 files changed, 31 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index e2f0449216..3d243d78ec 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -53,7 +53,7 @@ AnimationDetails ScriptableAvatar::getAnimationDetails() { void ScriptableAvatar::update(float deltatime) { // Run animation - if (_animation != NULL && _animation->isValid() && _animation->getFrames().size() > 0) { + if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0) { QStringList modelJoints = getJointNames(); QStringList animationJoints = _animation->getJointNames(); diff --git a/libraries/animation/src/AnimationCache.cpp b/libraries/animation/src/AnimationCache.cpp index 6c02ccbd2b..9eb68cedc2 100644 --- a/libraries/animation/src/AnimationCache.cpp +++ b/libraries/animation/src/AnimationCache.cpp @@ -39,8 +39,7 @@ QSharedPointer AnimationCache::createResource(const QUrl& url, const Q } Animation::Animation(const QUrl& url) : - Resource(url), - _isValid(false) { + Resource(url) { } class AnimationReader : public QRunnable { @@ -97,7 +96,6 @@ QVector Animation::getFrames() const { void Animation::setGeometry(const FBXGeometry& geometry) { _geometry = geometry; finishedLoading(true); - _isValid = true; } void Animation::downloadFinished(QNetworkReply* reply) { diff --git a/libraries/animation/src/AnimationCache.h b/libraries/animation/src/AnimationCache.h index 6dbd5fdaad..c90c4c9225 100644 --- a/libraries/animation/src/AnimationCache.h +++ b/libraries/animation/src/AnimationCache.h @@ -57,8 +57,6 @@ public: Q_INVOKABLE QStringList getJointNames() const; Q_INVOKABLE QVector getFrames() const; - - bool isValid() const { return _isValid; } protected: @@ -69,7 +67,6 @@ protected: private: FBXGeometry _geometry; - bool _isValid; }; diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 36b0345d34..f49d51bb8b 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -294,7 +294,7 @@ AudioInjector* AudioInjector::playSound(const QString& soundUrl, const float vol if (soundCache.isNull()) { return NULL; } - SharedSoundPointer sound = soundCache.data()->getSound(QUrl(soundUrl)); + SharedSoundPointer sound = soundCache->getSound(QUrl(soundUrl)); if (sound.isNull() || !sound->isReady()) { return NULL; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index a6ae9e04de..b72dd5fab4 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -184,7 +184,7 @@ void ModelEntityItem::cleanupLoadedAnimations() { _loadedAnimations.clear(); } -Animation* ModelEntityItem::getAnimation(const QString& url) { +AnimationPointer ModelEntityItem::getAnimation(const QString& url) { AnimationPointer animation; // if we don't already have this model then create it and initialize it @@ -194,7 +194,7 @@ Animation* ModelEntityItem::getAnimation(const QString& url) { } else { animation = _loadedAnimations[url]; } - return animation.data(); + return animation; } void ModelEntityItem::mapJoints(const QStringList& modelJointNames) { @@ -203,9 +203,8 @@ void ModelEntityItem::mapJoints(const QStringList& modelJointNames) { return; } - Animation* myAnimation = getAnimation(_animationURL); - - if (!_jointMappingCompleted) { + AnimationPointer myAnimation = getAnimation(_animationURL); + if (myAnimation && myAnimation->isLoaded()) { QStringList animationJointNames = myAnimation->getJointNames(); if (modelJointNames.size() > 0 && animationJointNames.size() > 0) { @@ -220,8 +219,12 @@ void ModelEntityItem::mapJoints(const QStringList& modelJointNames) { QVector ModelEntityItem::getAnimationFrame() { QVector frameData; - if (hasAnimation() && _jointMappingCompleted) { - Animation* myAnimation = getAnimation(_animationURL); + if (!hasAnimation() || !_jointMappingCompleted) { + return frameData; + } + + AnimationPointer myAnimation = getAnimation(_animationURL); + if (myAnimation && myAnimation->isLoaded()) { QVector frames = myAnimation->getFrames(); int frameCount = frames.size(); if (frameCount > 0) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 32441decd3..ae6a86cde1 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -141,7 +141,7 @@ protected: bool _jointMappingCompleted; QVector _jointMapping; - static Animation* getAnimation(const QString& url); + static AnimationPointer getAnimation(const QString& url); static QMap _loadedAnimations; static AnimationCache _animationCache; diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index f3ed60c281..e127380630 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -271,11 +271,11 @@ void Resource::refresh() { _replyTimer->deleteLater(); _replyTimer = nullptr; } + init(); _request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); - if (!_startedLoading) { - attemptRequest(); - } + ensureLoading(); + emit onRefresh(); } void Resource::allReferencesCleared() { @@ -331,8 +331,7 @@ void Resource::reinsert() { _cache->_resources.insert(_url, _self); } -const int REPLY_TIMEOUT_MS = 5000; - +static const int REPLY_TIMEOUT_MS = 5000; void Resource::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { if (!_reply->isFinished()) { _bytesReceived = bytesReceived; diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 4997826870..93ddfe77be 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -175,6 +175,7 @@ public: signals: /// Fired when the resource has been loaded. void loaded(); + void onRefresh(); protected slots: void attemptRequest(); diff --git a/libraries/render-utils/src/AnimationHandle.cpp b/libraries/render-utils/src/AnimationHandle.cpp index 55995b87d8..217c4948e8 100644 --- a/libraries/render-utils/src/AnimationHandle.cpp +++ b/libraries/render-utils/src/AnimationHandle.cpp @@ -15,6 +15,7 @@ void AnimationHandle::setURL(const QUrl& url) { if (_url != url) { _animation = DependencyManager::get()->getAnimation(_url = url); + QObject::connect(_animation.data(), &Resource::onRefresh, this, &AnimationHandle::clearJoints); _jointMappings.clear(); } } @@ -110,11 +111,15 @@ void AnimationHandle::setAnimationDetails(const AnimationDetails& details) { void AnimationHandle::simulate(float deltaTime) { + if (!_animation->isLoaded()) { + return; + } + _animationLoop.simulate(deltaTime); // update the joint mappings if necessary/possible if (_jointMappings.isEmpty()) { - if (_model->isActive()) { + if (_model && _model->isActive()) { _jointMappings = _model->getGeometry()->getJointMappings(_animation); } if (_jointMappings.isEmpty()) { @@ -146,6 +151,10 @@ void AnimationHandle::simulate(float deltaTime) { } void AnimationHandle::applyFrame(float frameIndex) { + if (!_animation->isLoaded()) { + return; + } + const FBXGeometry& animationGeometry = _animation->getGeometry(); int frameCount = animationGeometry.animationFrames.size(); const FBXAnimationFrame& floorFrame = animationGeometry.animationFrames.at((int)glm::floor(frameIndex) % frameCount); diff --git a/libraries/render-utils/src/AnimationHandle.h b/libraries/render-utils/src/AnimationHandle.h index 13a1b97dc1..ca9c2eb6d0 100644 --- a/libraries/render-utils/src/AnimationHandle.h +++ b/libraries/render-utils/src/AnimationHandle.h @@ -94,6 +94,8 @@ private: void replaceMatchingPriorities(float newPriority); void restoreJoints(); + void clearJoints() { _jointMappings.clear(); } + Model* _model; WeakAnimationHandlePointer _self; AnimationPointer _animation; From 5cfa1605dfaf27604e78c52eee04172c9e8f21d6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 10 Jul 2015 12:28:06 -0700 Subject: [PATCH 06/44] Made Texture safe with resource refresh --- .../src/ui/overlays/BillboardOverlay.cpp | 6 +++--- libraries/model/src/model/Skybox.cpp | 2 +- libraries/render-utils/src/GeometryCache.cpp | 21 +++++++------------ 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 988223765a..365c8a2785 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -28,12 +28,12 @@ BillboardOverlay::BillboardOverlay(const BillboardOverlay* billboardOverlay) : } void BillboardOverlay::render(RenderArgs* args) { - if (!_isLoaded) { + if (!_texture) { _isLoaded = true; _texture = DependencyManager::get()->getTexture(_url); } - if (!_visible || !_texture->isLoaded()) { + if (!_visible || !_texture || !_texture->isLoaded()) { return; } @@ -170,7 +170,7 @@ void BillboardOverlay::setBillboardURL(const QString& url) { bool BillboardOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) { - if (_texture) { + if (_texture && _texture->isLoaded()) { glm::quat rotation = getRotation(); if (_isFacingAvatar) { // rotate about vertical to face the camera diff --git a/libraries/model/src/model/Skybox.cpp b/libraries/model/src/model/Skybox.cpp index 5be3412c6c..a02c646668 100755 --- a/libraries/model/src/model/Skybox.cpp +++ b/libraries/model/src/model/Skybox.cpp @@ -101,7 +101,7 @@ void Skybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const Sky batch.setModelTransform(Transform()); // only for Mac batch.setPipeline(thePipeline); batch.setInputBuffer(gpu::Stream::POSITION, theBuffer, 0, 8); - //batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); + batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); batch.setInputFormat(theFormat); batch.setUniformTexture(0, skybox.getCubemap()); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 02e59bfa3a..6d0748df7c 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -2061,21 +2061,16 @@ void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& u QSharedPointer matchingTexture = QSharedPointer(); if (part.diffuseTextureName == name) { - part.diffuseTexture = - textureCache->getTexture(url, DEFAULT_TEXTURE, - _geometry.meshes[i].isEye, QByteArray()); + part.diffuseTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, _geometry.meshes[i].isEye); part.diffuseTexture->setLoadPriorities(_loadPriorities); } else if (part.normalTextureName == name) { - part.normalTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, - false, QByteArray()); + part.normalTexture = textureCache->getTexture(url); part.normalTexture->setLoadPriorities(_loadPriorities); } else if (part.specularTextureName == name) { - part.specularTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, - false, QByteArray()); + part.specularTexture = textureCache->getTexture(url); part.specularTexture->setLoadPriorities(_loadPriorities); } else if (part.emissiveTextureName == name) { - part.emissiveTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, - false, QByteArray()); + part.emissiveTexture = textureCache->getTexture(url); part.emissiveTexture->setLoadPriorities(_loadPriorities); } } @@ -2095,22 +2090,22 @@ QStringList NetworkGeometry::getTextureNames() const { for (int j = 0; j < mesh.parts.size(); j++) { const NetworkMeshPart& part = mesh.parts[j]; - if (!part.diffuseTextureName.isEmpty()) { + if (!part.diffuseTextureName.isEmpty() && part.diffuseTexture) { QString textureURL = part.diffuseTexture->getURL().toString(); result << part.diffuseTextureName + ":" + textureURL; } - if (!part.normalTextureName.isEmpty()) { + if (!part.normalTextureName.isEmpty() && part.normalTexture) { QString textureURL = part.normalTexture->getURL().toString(); result << part.normalTextureName + ":" + textureURL; } - if (!part.specularTextureName.isEmpty()) { + if (!part.specularTextureName.isEmpty() && part.specularTexture) { QString textureURL = part.specularTexture->getURL().toString(); result << part.specularTextureName + ":" + textureURL; } - if (!part.emissiveTextureName.isEmpty()) { + if (!part.emissiveTextureName.isEmpty() && part.emissiveTexture) { QString textureURL = part.emissiveTexture->getURL().toString(); result << part.emissiveTextureName + ":" + textureURL; } From 49993695a5f7dc53486b37bfc05607f2e17cded1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 10 Jul 2015 15:20:19 -0700 Subject: [PATCH 07/44] Made geometry refresh safe --- .../src/EntityTreeRenderer.cpp | 2 +- .../src/RenderableModelEntityItem.cpp | 6 +-- libraries/render-utils/src/Model.cpp | 47 ++++++++++++++++--- libraries/render-utils/src/Model.h | 8 ++-- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 11d24c6d9d..5bad452d00 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -544,7 +544,7 @@ const FBXGeometry* EntityTreeRenderer::getCollisionGeometryForEntity(EntityItemP Model* model = modelEntityItem->getModel(this); if (model) { const QSharedPointer collisionNetworkGeometry = model->getCollisionGeometry(); - if (!collisionNetworkGeometry.isNull()) { + if (!collisionNetworkGeometry || !collisionNetworkGeometry->isLoaded()) { result = &collisionNetworkGeometry->getFBXGeometry(); } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 85b7bafc78..cc4c8390c9 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -397,8 +397,8 @@ bool RenderableModelEntityItem::isReadyToComputeShape() { const QSharedPointer collisionNetworkGeometry = _model->getCollisionGeometry(); const QSharedPointer renderNetworkGeometry = _model->getGeometry(); - if ((! collisionNetworkGeometry.isNull() && collisionNetworkGeometry->isLoadedWithTextures()) && - (! renderNetworkGeometry.isNull() && renderNetworkGeometry->isLoadedWithTextures())) { + if ((!collisionNetworkGeometry && collisionNetworkGeometry->isLoadedWithTextures()) && + (!renderNetworkGeometry && renderNetworkGeometry->isLoadedWithTextures())) { // we have both URLs AND both geometries AND they are both fully loaded. return true; } @@ -419,7 +419,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) { // should never fall in here when collision model not fully loaded // hence we assert collisionNetworkGeometry is not NULL - assert(!collisionNetworkGeometry.isNull()); + assert(!collisionNetworkGeometry); const FBXGeometry& collisionGeometry = collisionNetworkGeometry->getFBXGeometry(); const QSharedPointer renderNetworkGeometry = _model->getGeometry(); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 03140c4dfb..2820fe74a9 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -457,7 +457,8 @@ bool Model::updateGeometry() { } deleteGeometry(); _dilatedTextures.clear(); - _geometry = geometry; + setGeometry(geometry); + _meshGroupsKnown = false; _readyWhenAdded = false; // in case any of our users are using scenes invalidCalculatedMeshBoxes(); // if we have to reload, we need to assume our mesh boxes are all invalid @@ -1142,13 +1143,32 @@ void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bo onInvalidate(); // if so instructed, keep the current geometry until the new one is loaded - _nextBaseGeometry = _nextGeometry = DependencyManager::get()->getGeometry(url, fallback, delayLoad); + _nextGeometry = DependencyManager::get()->getGeometry(url, fallback, delayLoad); _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; if (!retainCurrent || !isActive() || (_nextGeometry && _nextGeometry->isLoaded())) { applyNextGeometry(); } } +void Model::geometryRefreshed() { + QObject* sender = QObject::sender(); + + if (sender == _geometry) { + _readyWhenAdded = false; // reset out render items. + _needsReload = true; + invalidCalculatedMeshBoxes(); + + onInvalidate(); + + // if so instructed, keep the current geometry until the new one is loaded + _nextGeometry = DependencyManager::get()->getGeometry(_url); + _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; + applyNextGeometry(); + } else { + sender->disconnect(this, SLOT(geometryRefreshed())); + } +} + const QSharedPointer Model::getCollisionGeometry(bool delayLoad) { @@ -1156,7 +1176,11 @@ const QSharedPointer Model::getCollisionGeometry(bool delayLoad _collisionGeometry = DependencyManager::get()->getGeometry(_collisionUrl, QUrl(), delayLoad); } - return _collisionGeometry; + if (_collisionGeometry && _collisionGeometry->isLoaded()) { + return _collisionGeometry; + } + + return QSharedPointer(); } void Model::setCollisionModelURL(const QUrl& url) { @@ -1776,6 +1800,18 @@ void Model::setBlendedVertices(int blendNumber, const QWeakPointer& newGeometry) { + if (_geometry == newGeometry) { + return; + } + + if (_geometry) { + _geometry->disconnect(_geometry.data(), &Resource::onRefresh, this, &Model::geometryRefreshed); + } + _geometry = newGeometry; + QObject::connect(_geometry.data(), &Resource::onRefresh, this, &Model::geometryRefreshed); +} + void Model::applyNextGeometry() { // delete our local geometry and custom textures deleteGeometry(); @@ -1783,13 +1819,12 @@ void Model::applyNextGeometry() { _lodHysteresis = _nextLODHysteresis; // we retain a reference to the base geometry so that its reference count doesn't fall to zero - _baseGeometry = _nextBaseGeometry; - _geometry = _nextGeometry; + setGeometry(_nextGeometry); + _meshGroupsKnown = false; _readyWhenAdded = false; // in case any of our users are using scenes _needsReload = false; // we are loaded now! invalidCalculatedMeshBoxes(); - _nextBaseGeometry.reset(); _nextGeometry.reset(); } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index a6ce566a36..60e4d1dbaa 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -245,6 +245,7 @@ public: protected: QSharedPointer _geometry; + void setGeometry(const QSharedPointer& newGeometry); glm::vec3 _scale; glm::vec3 _offset; @@ -321,6 +322,9 @@ protected: // hook for derived classes to be notified when setUrl invalidates the current model. virtual void onInvalidate() {}; +protected slots: + void geometryRefreshed(); + private: friend class AnimationHandle; @@ -330,15 +334,12 @@ private: QVector createJointStates(const FBXGeometry& geometry); void initJointTransforms(); - QSharedPointer _baseGeometry; ///< reference required to prevent collection of base - QSharedPointer _nextBaseGeometry; QSharedPointer _nextGeometry; float _lodDistance; float _lodHysteresis; float _nextLODHysteresis; QSharedPointer _collisionGeometry; - QSharedPointer _saveNonCollisionGeometry; float _pupilDilation; QVector _blendshapeCoefficients; @@ -524,7 +525,6 @@ private: QMap _renderItems; bool _readyWhenAdded = false; bool _needsReload = true; - }; Q_DECLARE_METATYPE(QPointer) From a3848f08d2c9d9da3639f90155df9759946a3925 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 10 Jul 2015 15:36:17 -0700 Subject: [PATCH 08/44] Conditionnal fixes. --- interface/src/avatar/Avatar.cpp | 2 +- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 +- .../entities-renderer/src/RenderableModelEntityItem.cpp | 6 +++--- libraries/render-utils/src/AnimationHandle.cpp | 4 ++-- libraries/render-utils/src/GeometryCache.cpp | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 3d4c158a0b..48dad3cabb 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -622,7 +622,7 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { _billboardTexture = DependencyManager::get()->getTexture( uniqueUrl, DEFAULT_TEXTURE, false, _billboard); } - if (!_billboardTexture->isLoaded()) { + if (!_billboardTexture || !_billboardTexture->isLoaded()) { return; } // rotate about vertical to face the camera diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 5bad452d00..a2ea23c51e 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -544,7 +544,7 @@ const FBXGeometry* EntityTreeRenderer::getCollisionGeometryForEntity(EntityItemP Model* model = modelEntityItem->getModel(this); if (model) { const QSharedPointer collisionNetworkGeometry = model->getCollisionGeometry(); - if (!collisionNetworkGeometry || !collisionNetworkGeometry->isLoaded()) { + if (collisionNetworkGeometry && collisionNetworkGeometry->isLoaded()) { result = &collisionNetworkGeometry->getFBXGeometry(); } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index cc4c8390c9..03aca71284 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -397,8 +397,8 @@ bool RenderableModelEntityItem::isReadyToComputeShape() { const QSharedPointer collisionNetworkGeometry = _model->getCollisionGeometry(); const QSharedPointer renderNetworkGeometry = _model->getGeometry(); - if ((!collisionNetworkGeometry && collisionNetworkGeometry->isLoadedWithTextures()) && - (!renderNetworkGeometry && renderNetworkGeometry->isLoadedWithTextures())) { + if ((collisionNetworkGeometry && collisionNetworkGeometry->isLoadedWithTextures()) && + (renderNetworkGeometry && renderNetworkGeometry->isLoadedWithTextures())) { // we have both URLs AND both geometries AND they are both fully loaded. return true; } @@ -419,7 +419,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) { // should never fall in here when collision model not fully loaded // hence we assert collisionNetworkGeometry is not NULL - assert(!collisionNetworkGeometry); + assert(collisionNetworkGeometry); const FBXGeometry& collisionGeometry = collisionNetworkGeometry->getFBXGeometry(); const QSharedPointer renderNetworkGeometry = _model->getGeometry(); diff --git a/libraries/render-utils/src/AnimationHandle.cpp b/libraries/render-utils/src/AnimationHandle.cpp index 217c4948e8..6ad6730952 100644 --- a/libraries/render-utils/src/AnimationHandle.cpp +++ b/libraries/render-utils/src/AnimationHandle.cpp @@ -111,7 +111,7 @@ void AnimationHandle::setAnimationDetails(const AnimationDetails& details) { void AnimationHandle::simulate(float deltaTime) { - if (!_animation->isLoaded()) { + if (!_animation || !_animation->isLoaded()) { return; } @@ -151,7 +151,7 @@ void AnimationHandle::simulate(float deltaTime) { } void AnimationHandle::applyFrame(float frameIndex) { - if (!_animation->isLoaded()) { + if (!_animation || !_animation->isLoaded()) { return; } diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 6d0748df7c..14890bd154 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1942,7 +1942,7 @@ QSharedPointer NetworkGeometry::getLODOrFallback(float distance } } } - if (lod->isLoaded()) { + if (lod && lod->isLoaded()) { hysteresis = lodDistance; return lod; } From ec7e1df8c0ae2d0f720481bdf8b0fc1beacdcaac Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 10 Jul 2015 15:47:46 -0700 Subject: [PATCH 09/44] Move and rename menu item --- interface/src/Application.cpp | 2 +- interface/src/Application.h | 2 +- interface/src/Menu.cpp | 3 ++- interface/src/Menu.h | 2 +- libraries/model/src/model/Skybox.cpp | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 140656bc16..1281b12a53 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2415,7 +2415,7 @@ void Application::cameraMenuChanged() { } } -void Application::clearCacheAndRestart() { +void Application::reloadResourceCaches() { emptyLocalCache(); DependencyManager::get()->refreshAll(); diff --git a/interface/src/Application.h b/interface/src/Application.h index a4c584da50..21d5d72a54 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -454,7 +454,7 @@ public slots: void cameraMenuChanged(); - void clearCacheAndRestart(); + void reloadResourceCaches(); private slots: void clearDomainOctreeDetails(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7808840232..ee9f7491ac 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -127,7 +127,6 @@ Menu::Menu() { addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyPath, 0, addressManager.data(), SLOT(copyPath())); - addActionToQMenuAndActionHash(fileMenu, MenuOption::ClearCacheAndRestart, 0, qApp, SLOT(clearCacheAndRestart())); addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, @@ -257,6 +256,8 @@ Menu::Menu() { avatar, SLOT(updateMotionBehavior())); MenuWrapper* viewMenu = addMenu("View"); + + addActionToQMenuAndActionHash(viewMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Fullscreen, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index aa8e3f7a2a..9387a97c69 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -160,7 +160,6 @@ namespace MenuOption { const QString CalibrateCamera = "Calibrate Camera"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; - const QString ClearCacheAndRestart = "Clear Cache and Restart"; const QString Collisions = "Collisions"; const QString Console = "Console..."; const QString ControlWithSpeech = "Control With Speech"; @@ -231,6 +230,7 @@ namespace MenuOption { const QString Preferences = "Preferences..."; const QString Quit = "Quit"; const QString ReloadAllScripts = "Reload All Scripts"; + const QString ReloadContent = "Reload Content (Clears all caches)"; const QString RenderBoundingCollisionShapes = "Show Bounding Collision Shapes"; const QString RenderFocusIndicator = "Show Eye Focus"; const QString RenderHeadCollisionShapes = "Show Head Collision Shapes"; diff --git a/libraries/model/src/model/Skybox.cpp b/libraries/model/src/model/Skybox.cpp index a02c646668..5be3412c6c 100755 --- a/libraries/model/src/model/Skybox.cpp +++ b/libraries/model/src/model/Skybox.cpp @@ -101,7 +101,7 @@ void Skybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const Sky batch.setModelTransform(Transform()); // only for Mac batch.setPipeline(thePipeline); batch.setInputBuffer(gpu::Stream::POSITION, theBuffer, 0, 8); - batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); + //batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); batch.setInputFormat(theFormat); batch.setUniformTexture(0, skybox.getCubemap()); batch.draw(gpu::TRIANGLE_STRIP, 4); From 8ecefdfe392931be3cab7fdbebf1ae0239a3d816 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 10 Jul 2015 16:03:27 -0700 Subject: [PATCH 10/44] If an external texture isn't found, still display the model If the texture is present the next Interface is run then it will be used. --- .../src/RenderableModelEntityItem.cpp | 12 +++---- libraries/render-utils/src/Model.cpp | 33 +++++++++---------- libraries/render-utils/src/Model.h | 3 +- libraries/render-utils/src/TextureCache.cpp | 20 +++++++++-- libraries/render-utils/src/TextureCache.h | 8 +++++ 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 85b7bafc78..791b1de469 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -63,11 +63,11 @@ void RenderableModelEntityItem::remapTextures() { return; // nothing to do if we don't have a model } - if (!_model->isLoadedWithTextures()) { - return; // nothing to do if the model has not yet loaded its default textures + if (!_model->isLoaded()) { + return; // nothing to do if the model has not yet loaded } - if (!_originalTexturesRead && _model->isLoadedWithTextures()) { + if (!_originalTexturesRead) { const QSharedPointer& networkGeometry = _model->getGeometry(); if (networkGeometry) { _originalTextures = networkGeometry->getTextureNames(); @@ -119,7 +119,7 @@ bool RenderableModelEntityItem::readyToAddToScene(RenderArgs* renderArgs) { EntityTreeRenderer* renderer = static_cast(renderArgs->_renderer); getModel(renderer); } - if (renderArgs && _model && _needsInitialSimulation && _model->isActive() && _model->isLoadedWithTextures()) { + if (renderArgs && _model && _needsInitialSimulation && _model->isActive() && _model->isLoaded()) { _model->setScaleToFit(true, getDimensions()); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); _model->setRotation(getRotation()); @@ -397,8 +397,8 @@ bool RenderableModelEntityItem::isReadyToComputeShape() { const QSharedPointer collisionNetworkGeometry = _model->getCollisionGeometry(); const QSharedPointer renderNetworkGeometry = _model->getGeometry(); - if ((! collisionNetworkGeometry.isNull() && collisionNetworkGeometry->isLoadedWithTextures()) && - (! renderNetworkGeometry.isNull() && renderNetworkGeometry->isLoadedWithTextures())) { + if ((! collisionNetworkGeometry.isNull() && collisionNetworkGeometry->isLoaded()) && + (! renderNetworkGeometry.isNull() && renderNetworkGeometry->isLoaded())) { // we have both URLs AND both geometries AND they are both fully loaded. return true; } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 03140c4dfb..edc74eac2f 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -824,7 +824,7 @@ void Model::renderSetup(RenderArgs* args) { } } - if (!_meshGroupsKnown && isLoadedWithTextures()) { + if (!_meshGroupsKnown && isLoaded()) { segregateMeshGroups(); } } @@ -883,7 +883,7 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr scen bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges) { - if (!_meshGroupsKnown && isLoadedWithTextures()) { + if (!_meshGroupsKnown && isLoaded()) { segregateMeshGroups(); } @@ -913,7 +913,7 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan } bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters) { - if (!_meshGroupsKnown && isLoadedWithTextures()) { + if (!_meshGroupsKnown && isLoaded()) { segregateMeshGroups(); } @@ -2029,12 +2029,10 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran } } } - static bool showDiffuse = true; - if (showDiffuse && diffuseMap) { + if (diffuseMap && static_cast(diffuseMap)->isLoaded()) { batch.setUniformTexture(0, diffuseMap->getGPUTexture()); - } else { - batch.setUniformTexture(0, textureCache->getWhiteTexture()); + batch.setUniformTexture(0, textureCache->getGrayTexture()); } if (locations->texcoordMatrices >= 0) { @@ -2049,16 +2047,15 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran } if (!mesh.tangents.isEmpty()) { - Texture* normalMap = networkPart.normalTexture.data(); - batch.setUniformTexture(1, !normalMap ? - textureCache->getBlueTexture() : normalMap->getGPUTexture()); - + NetworkTexture* normalMap = networkPart.normalTexture.data(); + batch.setUniformTexture(1, !normalMap || !normalMap->isLoaded() ? + textureCache->getBlueTexture() : normalMap->getGPUTexture()); } if (locations->specularTextureUnit >= 0) { - Texture* specularMap = networkPart.specularTexture.data(); - batch.setUniformTexture(locations->specularTextureUnit, !specularMap ? - textureCache->getWhiteTexture() : specularMap->getGPUTexture()); + NetworkTexture* specularMap = networkPart.specularTexture.data(); + batch.setUniformTexture(locations->specularTextureUnit, !specularMap || !specularMap->isLoaded() ? + textureCache->getBlackTexture() : specularMap->getGPUTexture()); } if (args) { @@ -2073,9 +2070,9 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran float emissiveScale = part.emissiveParams.y; GLBATCH(glUniform2f)(locations->emissiveParams, emissiveOffset, emissiveScale); - Texture* emissiveMap = networkPart.emissiveTexture.data(); - batch.setUniformTexture(locations->emissiveTextureUnit, !emissiveMap ? - textureCache->getWhiteTexture() : emissiveMap->getGPUTexture()); + NetworkTexture* emissiveMap = networkPart.emissiveTexture.data(); + batch.setUniformTexture(locations->emissiveTextureUnit, !emissiveMap || !emissiveMap->isLoaded() ? + textureCache->getGrayTexture() : emissiveMap->getGPUTexture()); } if (translucent && locations->lightBufferUnit >= 0) { @@ -2188,7 +2185,7 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f } bool Model::initWhenReady(render::ScenePointer scene) { - if (isActive() && isRenderable() && !_meshGroupsKnown && isLoadedWithTextures()) { + if (isActive() && isRenderable() && !_meshGroupsKnown && isLoaded()) { segregateMeshGroups(); render::PendingChanges pendingChanges; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index a6ce566a36..e1fcbcef25 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -106,6 +106,7 @@ public: void setVisibleInScene(bool newValue, std::shared_ptr scene); bool isVisible() const { return _isVisible; } + bool isLoaded() const { return _geometry && _geometry->isLoaded(); } bool isLoadedWithTextures() const { return _geometry && _geometry->isLoadedWithTextures(); } void init(); @@ -116,7 +117,7 @@ public: // new Scene/Engine rendering support bool needsFixupInScene() { return !_readyWhenAdded && readyToAddToScene(); } - bool readyToAddToScene(RenderArgs* renderArgs = nullptr) { return !_needsReload && isRenderable() && isActive() && isLoadedWithTextures(); } + bool readyToAddToScene(RenderArgs* renderArgs = nullptr) { return !_needsReload && isRenderable() && isActive() && isLoaded(); } bool addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges); bool addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters); void removeFromScene(std::shared_ptr scene, render::PendingChanges& pendingChanges); diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 97385cb060..4df9718e24 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -118,9 +118,9 @@ const gpu::TexturePointer& TextureCache::getPermutationNormalTexture() { } const unsigned char OPAQUE_WHITE[] = { 0xFF, 0xFF, 0xFF, 0xFF }; -//const unsigned char TRANSPARENT_WHITE[] = { 0xFF, 0xFF, 0xFF, 0x0 }; -//const unsigned char OPAQUE_BLACK[] = { 0x0, 0x0, 0x0, 0xFF }; +const unsigned char OPAQUE_GRAY[] = { 0x80, 0x80, 0x80, 0xFF }; const unsigned char OPAQUE_BLUE[] = { 0x80, 0x80, 0xFF, 0xFF }; +const unsigned char OPAQUE_BLACK[] = { 0x00, 0x00, 0x00, 0xFF }; /* static void loadSingleColorTexture(const unsigned char* color) { @@ -137,6 +137,14 @@ const gpu::TexturePointer& TextureCache::getWhiteTexture() { return _whiteTexture; } +const gpu::TexturePointer& TextureCache::getGrayTexture() { + if (!_grayTexture) { + _grayTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), 1, 1)); + _grayTexture->assignStoredMip(0, _whiteTexture->getTexelFormat(), sizeof(OPAQUE_WHITE), OPAQUE_GRAY); + } + return _grayTexture; +} + const gpu::TexturePointer& TextureCache::getBlueTexture() { if (!_blueTexture) { _blueTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), 1, 1)); @@ -145,6 +153,14 @@ const gpu::TexturePointer& TextureCache::getBlueTexture() { return _blueTexture; } +const gpu::TexturePointer& TextureCache::getBlackTexture() { + if (!_blackTexture) { + _blackTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), 1, 1)); + _blackTexture->assignStoredMip(0, _whiteTexture->getTexelFormat(), sizeof(OPAQUE_BLACK), OPAQUE_BLACK); + } + return _blackTexture; +} + /// Extra data for creating textures. class TextureExtra { public: diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index ba7176b2a4..fc02438c84 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -52,9 +52,15 @@ public: /// Returns an opaque white texture (useful for a default). const gpu::TexturePointer& getWhiteTexture(); + /// Returns an opaque gray texture (useful for a default). + const gpu::TexturePointer& getGrayTexture(); + /// Returns the a pale blue texture (useful for a normal map). const gpu::TexturePointer& getBlueTexture(); + /// Returns the a black texture (useful for a default). + const gpu::TexturePointer& getBlackTexture(); + /// Returns a texture version of an image file static gpu::TexturePointer getImageTexture(const QString& path); @@ -112,7 +118,9 @@ private: gpu::TexturePointer _permutationNormalTexture; gpu::TexturePointer _whiteTexture; + gpu::TexturePointer _grayTexture; gpu::TexturePointer _blueTexture; + gpu::TexturePointer _blackTexture; QHash > _dilatableNetworkTextures; From 51be24515974e60fe4625c979d3644981d5383c0 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 10 Jul 2015 16:55:45 -0700 Subject: [PATCH 11/44] Remove old octreeFade code that wasn't working anyway. --- interface/src/Application.cpp | 38 ---------------- interface/src/Application.h | 10 ----- interface/src/Menu.cpp | 1 - interface/src/Menu.h | 1 - interface/src/octree/OctreeFade.cpp | 68 ----------------------------- interface/src/octree/OctreeFade.h | 46 ------------------- tests/ui/src/main.cpp | 2 +- 7 files changed, 1 insertion(+), 165 deletions(-) delete mode 100644 interface/src/octree/OctreeFade.cpp delete mode 100644 interface/src/octree/OctreeFade.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 00a4440920..aa978f3464 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3572,23 +3572,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se if (!selfAvatarOnly) { _nodeBoundsDisplay.draw(); - // render octree fades if they exist - if (_octreeFades.size() > 0) { - PerformanceTimer perfTimer("octreeFades"); - PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "Application::displaySide() ... octree fades..."); - _octreeFadesLock.lockForWrite(); - for(std::vector::iterator fade = _octreeFades.begin(); fade != _octreeFades.end();) { - fade->render(renderArgs); - if(fade->isDone()) { - fade = _octreeFades.erase(fade); - } else { - ++fade; - } - } - _octreeFadesLock.unlock(); - } - // give external parties a change to hook in { PerformanceTimer perfTimer("inWorldInterface"); @@ -3880,17 +3863,6 @@ void Application::nodeKilled(SharedNodePointer node) { qCDebug(interfaceapp, "model server going away...... v[%f, %f, %f, %f]", (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); - // Add the jurisditionDetails object to the list of "fade outs" - if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnOctreeServerChanges)) { - OctreeFade fade(OctreeFade::FADE_OUT, NODE_KILLED_RED, NODE_KILLED_GREEN, NODE_KILLED_BLUE); - fade.voxelDetails = rootDetails; - const float slightly_smaller = 0.99f; - fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller; - _octreeFadesLock.lockForWrite(); - _octreeFades.push_back(fade); - _octreeFadesLock.unlock(); - } - // If the model server is going away, remove it from our jurisdiction map so we don't send voxels to a dead server _entityServerJurisdictions.lockForWrite(); _entityServerJurisdictions.erase(_entityServerJurisdictions.find(nodeUUID)); @@ -3967,16 +3939,6 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin qPrintable(serverType), (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); - // Add the jurisditionDetails object to the list of "fade outs" - if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnOctreeServerChanges)) { - OctreeFade fade(OctreeFade::FADE_OUT, NODE_ADDED_RED, NODE_ADDED_GREEN, NODE_ADDED_BLUE); - fade.voxelDetails = rootDetails; - const float slightly_smaller = 0.99f; - fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller; - _octreeFadesLock.lockForWrite(); - _octreeFades.push_back(fade); - _octreeFadesLock.unlock(); - } } else { jurisdiction->unlock(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 8dd987fbcd..b621b3e1f2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -72,7 +72,6 @@ #include "ui/ToolWindow.h" #include "ui/UserInputMapper.h" #include "devices/KeyboardMouseDevice.h" -#include "octree/OctreeFade.h" #include "octree/OctreePacketProcessor.h" #include "UndoStackScriptingInterface.h" @@ -91,13 +90,6 @@ class Node; class ProgramObject; class ScriptEngine; -static const float NODE_ADDED_RED = 0.0f; -static const float NODE_ADDED_GREEN = 1.0f; -static const float NODE_ADDED_BLUE = 0.0f; -static const float NODE_KILLED_RED = 1.0f; -static const float NODE_KILLED_GREEN = 0.0f; -static const float NODE_KILLED_BLUE = 0.0f; - static const QString SNAPSHOT_EXTENSION = ".jpg"; static const QString SVO_EXTENSION = ".svo"; static const QString SVO_JSON_EXTENSION = ".svo.json"; @@ -627,8 +619,6 @@ private: NodeBounds _nodeBoundsDisplay; - std::vector _octreeFades; - QReadWriteLock _octreeFadesLock; ControllerScriptingInterface _controllerScriptingInterface; QPointer _logDialog; QPointer _snapshotShareDialog; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9f49361f79..c583d40d2c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -340,7 +340,6 @@ Menu::Menu() { 0, // QML Qt::SHIFT | Qt::Key_A, true); addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::AmbientOcclusion); - addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::DontFadeOnOctreeServerChanges); MenuWrapper* ambientLightMenu = renderOptionsMenu->addMenu(MenuOption::RenderAmbientLight); QActionGroup* ambientLightGroup = new QActionGroup(ambientLightMenu); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 043bb53a7f..f7c00c72ff 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -179,7 +179,6 @@ namespace MenuOption { const QString DisplayModelElementProxy = "Display Model Element Bounds"; const QString DisplayDebugTimingDetails = "Display Timing Details"; const QString DontDoPrecisionPicking = "Don't Do Precision Picking"; - const QString DontFadeOnOctreeServerChanges = "Don't Fade In/Out on Octree Server Changes"; const QString DontRenderEntitiesAsScene = "Don't Render Entities as Scene"; const QString EchoLocalAudio = "Echo Local Audio"; const QString EchoServerAudio = "Echo Server Audio"; diff --git a/interface/src/octree/OctreeFade.cpp b/interface/src/octree/OctreeFade.cpp deleted file mode 100644 index 881f3c5938..0000000000 --- a/interface/src/octree/OctreeFade.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// OctreeFade.cpp -// interface/src/octree -// -// Created by Brad Hefta-Gaub on 8/6/13. -// Copyright 2013 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 "InterfaceConfig.h" - -#include -#include -#include - -#include "Application.h" -#include "OctreeFade.h" - -const float OctreeFade::FADE_OUT_START = 0.5f; -const float OctreeFade::FADE_OUT_END = 0.05f; -const float OctreeFade::FADE_OUT_STEP = 0.9f; -const float OctreeFade::FADE_IN_START = 0.05f; -const float OctreeFade::FADE_IN_END = 0.5f; -const float OctreeFade::FADE_IN_STEP = 1.1f; -const float OctreeFade::DEFAULT_RED = 0.5f; -const float OctreeFade::DEFAULT_GREEN = 0.5f; -const float OctreeFade::DEFAULT_BLUE = 0.5f; - -OctreeFade::OctreeFade(FadeDirection direction, float red, float green, float blue) : - direction(direction), - red(red), - green(green), - blue(blue) -{ - opacity = (direction == FADE_OUT) ? FADE_OUT_START : FADE_IN_START; -} - -void OctreeFade::render(RenderArgs* renderArgs) { - DependencyManager::get()->begin(renderArgs); - - glDisable(GL_LIGHTING); - glPushMatrix(); - glScalef(1.0f, 1.0f, 1.0f); - glTranslatef(voxelDetails.x + voxelDetails.s * 0.5f, - voxelDetails.y + voxelDetails.s * 0.5f, - voxelDetails.z + voxelDetails.s * 0.5f); - glLineWidth(1.0f); - DependencyManager::get()->renderSolidCube(voxelDetails.s, glm::vec4(red, green, blue, opacity)); - glLineWidth(1.0f); - glPopMatrix(); - glEnable(GL_LIGHTING); - - - DependencyManager::get()->end(renderArgs); - - opacity *= (direction == FADE_OUT) ? FADE_OUT_STEP : FADE_IN_STEP; -} - -bool OctreeFade::isDone() const { - if (direction == FADE_OUT) { - return opacity <= FADE_OUT_END; - } else { - return opacity >= FADE_IN_END; - } - return true; // unexpected case, assume we're done -} diff --git a/interface/src/octree/OctreeFade.h b/interface/src/octree/OctreeFade.h deleted file mode 100644 index 137a505537..0000000000 --- a/interface/src/octree/OctreeFade.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// OctreeFade.h -// interface/src/octree -// -// Created by Brad Hefta-Gaub on 8/6/13. -// Copyright 2013 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_OctreeFade_h -#define hifi_OctreeFade_h - -#include // for VoxelPositionSize - -class OctreeFade { -public: - - enum FadeDirection { FADE_OUT, FADE_IN}; - static const float FADE_OUT_START; - static const float FADE_OUT_END; - static const float FADE_OUT_STEP; - static const float FADE_IN_START; - static const float FADE_IN_END; - static const float FADE_IN_STEP; - static const float DEFAULT_RED; - static const float DEFAULT_GREEN; - static const float DEFAULT_BLUE; - - VoxelPositionSize voxelDetails; - FadeDirection direction; - float opacity; - - float red; - float green; - float blue; - - OctreeFade(FadeDirection direction = FADE_OUT, float red = DEFAULT_RED, - float green = DEFAULT_GREEN, float blue = DEFAULT_BLUE); - - void render(RenderArgs* renderArgs); - bool isDone() const; -}; - -#endif // hifi_OctreeFade_h diff --git a/tests/ui/src/main.cpp b/tests/ui/src/main.cpp index 19070e9699..07ff40d738 100644 --- a/tests/ui/src/main.cpp +++ b/tests/ui/src/main.cpp @@ -125,7 +125,7 @@ public: DisplayModelElementProxy, DisplayDebugTimingDetails, DontDoPrecisionPicking, - DontFadeOnOctreeServerChanges, + RESERVED_DontFadeOnOctreeServerChanges, DontRenderEntitiesAsScene, EchoLocalAudio, EchoServerAudio, From d8dde71c8f0be989151cf271be2498b1a594fa73 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 12 Jul 2015 18:46:08 -0700 Subject: [PATCH 12/44] Make scribe generated shaders more readable --- tools/scribe/src/main.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/tools/scribe/src/main.cpp b/tools/scribe/src/main.cpp index 10f0a026ca..9ffe18bb4f 100755 --- a/tools/scribe/src/main.cpp +++ b/tools/scribe/src/main.cpp @@ -192,17 +192,10 @@ int main (int argc, char** argv) { targetStringStream << "#ifndef scribe_" << targetName << "_h" << std::endl; targetStringStream << "#define scribe_" << targetName << "_h" << std::endl << std::endl; - // targetStringStream << "const char " << targetName << "[] = R\"XXXX(" << destStringStream.str() << ")XXXX\";"; - std::istringstream destStringStreamAgain(destStringStream.str()); - targetStringStream << "const char " << targetName << "[] = \n"; - while (!destStringStreamAgain.eof()) { - std::string lineToken; - std::getline(destStringStreamAgain, lineToken); - // targetStringStream << "\"" << lineToken << "\"\n"; - targetStringStream << "R\"X(" << lineToken << ")X\"\"\\n\"\n"; - } - - targetStringStream << ";\n" << std::endl << std::endl; + // targetStringStream << "const char " << targetName << "[] = R\"XXXX(" << destStringStream.str() << ")XXXX\";"; + targetStringStream << "const char " << targetName << "[] = R\"SCRIBE("; + targetStringStream << destStringStream.str(); + targetStringStream << "\n)SCRIBE\";\n\n"; targetStringStream << "#endif" << std::endl; } else { targetStringStream << destStringStream.str(); From 29333d0cad6a864423cd66e0664759769957deca Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 12 Jul 2015 18:52:15 -0700 Subject: [PATCH 13/44] Qt5.5 fixes --- libraries/avatars/src/AvatarHashMap.cpp | 2 ++ libraries/networking/src/DataServerAccountInfo.cpp | 1 + libraries/networking/src/DomainHandler.cpp | 1 + libraries/networking/src/JSONBreakableMarshal.h | 1 + libraries/networking/src/NetworkPeer.cpp | 1 + libraries/ui/src/VrMenu.cpp | 8 ++++---- 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 6d0d9d8d76..bf7a1a4464 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include #include #include diff --git a/libraries/networking/src/DataServerAccountInfo.cpp b/libraries/networking/src/DataServerAccountInfo.cpp index fd2c6da13d..a85aa588a8 100644 --- a/libraries/networking/src/DataServerAccountInfo.cpp +++ b/libraries/networking/src/DataServerAccountInfo.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "NetworkLogging.h" #include "DataServerAccountInfo.h" diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 38d1ade2ad..5f21708d28 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -12,6 +12,7 @@ #include #include +#include #include "Assignment.h" #include "HifiSockAddr.h" diff --git a/libraries/networking/src/JSONBreakableMarshal.h b/libraries/networking/src/JSONBreakableMarshal.h index cbcc454f5a..287fed675a 100644 --- a/libraries/networking/src/JSONBreakableMarshal.h +++ b/libraries/networking/src/JSONBreakableMarshal.h @@ -17,6 +17,7 @@ #include #include #include +#include class JSONBreakableMarshal { public: diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp index dfa4066dd2..2e98c096ab 100644 --- a/libraries/networking/src/NetworkPeer.cpp +++ b/libraries/networking/src/NetworkPeer.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp index 1b402ff2a3..4c83e6e3cd 100644 --- a/libraries/ui/src/VrMenu.cpp +++ b/libraries/ui/src/VrMenu.cpp @@ -102,13 +102,15 @@ class QQuickMenuItem; QObject* addItem(QObject* parent, const QString& text) { // FIXME add more checking here to ensure no name conflicts QQuickMenuItem* returnedValue{ nullptr }; - #ifndef QT_NO_DEBUG bool invokeResult = - #endif QMetaObject::invokeMethod(parent, "addItem", Qt::DirectConnection, Q_RETURN_ARG(QQuickMenuItem*, returnedValue), Q_ARG(QString, text)); +#ifndef QT_NO_DEBUG Q_ASSERT(invokeResult); +#else + Q_UNUSED(invokeResult); +#endif QObject* result = reinterpret_cast(returnedValue); return result; } @@ -206,9 +208,7 @@ void VrMenu::insertAction(QAction* before, QAction* action) { result = ::addItem(menu, action->text()); } else { QQuickMenuItem* returnedValue{ nullptr }; - #ifndef QT_NO_DEBUG bool invokeResult = - #endif QMetaObject::invokeMethod(menu, "insertItem", Qt::DirectConnection, Q_RETURN_ARG(QQuickMenuItem*, returnedValue), Q_ARG(int, index), Q_ARG(QString, action->text())); Q_ASSERT(invokeResult); From 2bab7d1c037845c87dbc18b521d546bf361a175a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 13 Jul 2015 16:38:51 -0700 Subject: [PATCH 14/44] Add parentheses --- libraries/render-utils/src/Model.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 00d1d89fab..4d1a37fe61 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2048,13 +2048,13 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran if (!mesh.tangents.isEmpty()) { NetworkTexture* normalMap = networkPart.normalTexture.data(); - batch.setResourceTexture(1, !normalMap || !normalMap->isLoaded() ? + batch.setResourceTexture(1, (!normalMap || !normalMap->isLoaded()) ? textureCache->getBlueTexture() : normalMap->getGPUTexture()); } if (locations->specularTextureUnit >= 0) { NetworkTexture* specularMap = networkPart.specularTexture.data(); - batch.setResourceTexture(locations->specularTextureUnit, !specularMap || !specularMap->isLoaded() ? + batch.setResourceTexture(locations->specularTextureUnit, (!specularMap || !specularMap->isLoaded()) ? textureCache->getBlackTexture() : specularMap->getGPUTexture()); } @@ -2071,7 +2071,7 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran GLBATCH(glUniform2f)(locations->emissiveParams, emissiveOffset, emissiveScale); NetworkTexture* emissiveMap = networkPart.emissiveTexture.data(); - batch.setResourceTexture(locations->emissiveTextureUnit, !emissiveMap || !emissiveMap->isLoaded() ? + batch.setResourceTexture(locations->emissiveTextureUnit, (!emissiveMap || !emissiveMap->isLoaded()) ? textureCache->getGrayTexture() : emissiveMap->getGPUTexture()); } From 7610fe48c228d092b1a14e5ae1ea6e9057244b80 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 14 Jul 2015 09:21:42 -0700 Subject: [PATCH 15/44] filter action updates during simulation ownership This fixes a bug where actions can be thrashed (created/deleted) by late entity update echos from the entity-server. --- libraries/entities/src/EntityItem.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 7354628390..50b36ec6e2 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -610,6 +610,9 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef int bytesRead = parser.offset(); #endif + auto nodeList = DependencyManager::get(); + const QUuid& myNodeID = nodeList->getSessionUUID(); + bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID); if (args.bitstreamVersion >= VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE) { // pack SimulationOwner and terse update properties near each other @@ -632,10 +635,8 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } { // When we own the simulation we don't accept updates to the entity's transform/velocities // but since we're using macros below we have to temporarily modify overwriteLocalData. - auto nodeList = DependencyManager::get(); - bool weOwnIt = _simulationOwner.matchesValidID(nodeList->getSessionUUID()); bool oldOverwrite = overwriteLocalData; - overwriteLocalData = overwriteLocalData && !weOwnIt; + overwriteLocalData = overwriteLocalData && !weOwnSimulation; READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePosition); READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation); READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, updateVelocity); @@ -657,6 +658,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); } else { // legacy order of packing here + // TODO: purge this logic in a few months from now (2015.07) READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, updatePosition); READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, updateDimensions); READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, updateRotation); @@ -702,7 +704,16 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_HREF, QString, setHref); READ_ENTITY_PROPERTY(PROP_DESCRIPTION, QString, setDescription); - READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setActionData); + { // When we own the simulation we don't accept updates to the entity's actions + // but since we're using macros below we have to temporarily modify overwriteLocalData. + // NOTE: this prevents userB from adding an action to an object1 when UserA + // has simulation ownership of it. + // TODO: figure out how to allow multiple users to update actions simultaneously + bool oldOverwrite = overwriteLocalData; + overwriteLocalData = overwriteLocalData && !weOwnSimulation; + READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setActionData); + overwriteLocalData = oldOverwrite; + } bytesRead += readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); @@ -713,7 +724,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // NOTE: we had a bad version of the stream that we added stream data after the subclass. We can attempt to recover // by doing this parsing here... but it's not likely going to fully recover the content. // - // TODO: Remove this conde once we've sufficiently migrated content past this damaged version + // TODO: Remove this code once we've sufficiently migrated content past this damaged version if (args.bitstreamVersion == VERSION_ENTITIES_HAS_MARKETPLACE_ID_DAMAGED) { READ_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, QString, setMarketplaceID); } @@ -738,8 +749,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } } - auto nodeList = DependencyManager::get(); - const QUuid& myNodeID = nodeList->getSessionUUID(); if (overwriteLocalData) { if (!_simulationOwner.matchesValidID(myNodeID)) { From 69db9aa01ac18f1330396f9b4fd8d7f8d847fc78 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 14 Jul 2015 09:23:05 -0700 Subject: [PATCH 16/44] fix grab transitions between vert and horiz planes --- examples/grab.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/grab.js b/examples/grab.js index f64aaa30ee..13c91bebb8 100644 --- a/examples/grab.js +++ b/examples/grab.js @@ -43,9 +43,10 @@ var gMaxGrabDistance; // elevationAzimuth var gGrabMode = "xzplane"; -// gGrabOffset allows the user to grab an object off-center. It points from ray's intersection -// with the move-plane to object center (at the moment the grab is initiated). Future target positions -// are relative to the ray's intersection by the same offset. +// gGrabOffset allows the user to grab an object off-center. It points from the object's center +// to the point where the ray intersects the grab plane (at the moment the grab is initiated). +// Future target positions of the ray intersection are on the same plane, and the offset is subtracted +// to compute the target position of the object's center. var gGrabOffset = { x: 0, y: 0, z: 0 }; var gTargetPosition; @@ -152,7 +153,6 @@ function computeNewGrabPlane() { maybeResetMousePosition = true; } gGrabMode = "xzPlane"; - gPointOnPlane = gCurrentPosition; gPlaneNormal = { x: 0, y: 1, z: 0 }; if (gLiftKey) { if (!gRotateKey) { @@ -163,7 +163,7 @@ function computeNewGrabPlane() { gGrabMode = "rotate"; } - gPointOnPlane = Vec3.subtract(gCurrentPosition, gGrabOffset); + gPointOnPlane = Vec3.sum(gCurrentPosition, gGrabOffset); var xzOffset = Vec3.subtract(gPointOnPlane, Camera.getPosition()); xzOffset.y = 0; gXzDistanceToGrab = Vec3.length(xzOffset); @@ -220,8 +220,8 @@ function mousePressEvent(event) { nearestPoint = Vec3.multiply(distanceToGrab, pickRay.direction); gPointOnPlane = Vec3.sum(cameraPosition, nearestPoint); - // compute the grab offset - gGrabOffset = Vec3.subtract(gStartPosition, gPointOnPlane); + // compute the grab offset (points from object center to point of grab) + gGrabOffset = Vec3.subtract(gPointOnPlane, gStartPosition); computeNewGrabPlane(); @@ -258,6 +258,7 @@ function mouseMoveEvent(event) { if (Vec3.length(entityProperties.gravity) != 0) { gOriginalGravity = entityProperties.gravity; } + gCurrentPosition = entityProperties.position; var actionArgs = {}; @@ -287,6 +288,7 @@ function mouseMoveEvent(event) { var pointOnCylinder = Vec3.multiply(planeNormal, gXzDistanceToGrab); pointOnCylinder = Vec3.sum(Camera.getPosition(), pointOnCylinder); newTargetPosition = mouseIntersectionWithPlane(pointOnCylinder, planeNormal, event); + gPointOnPlane = Vec3.sum(newTargetPosition, gGrabOffset); } else { var cameraPosition = Camera.getPosition(); newTargetPosition = mouseIntersectionWithPlane(gPointOnPlane, gPlaneNormal, event); @@ -298,7 +300,7 @@ function mouseMoveEvent(event) { newTargetPosition = Vec3.sum(relativePosition, cameraPosition); } } - gTargetPosition = Vec3.sum(newTargetPosition, gGrabOffset); + gTargetPosition = Vec3.subtract(newTargetPosition, gGrabOffset); actionArgs = {targetPosition: gTargetPosition, linearTimeScale: 0.1}; } gPreviousMouse = { x: event.x, y: event.y }; From c49851cf032d0add4a17fa368bb891f7135a41db Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 14 Jul 2015 09:33:08 -0700 Subject: [PATCH 17/44] Update sword script for current controller/physics behavior. --- examples/example/games/sword.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/examples/example/games/sword.js b/examples/example/games/sword.js index 18d6911f0b..178a48f35a 100644 --- a/examples/example/games/sword.js +++ b/examples/example/games/sword.js @@ -175,10 +175,12 @@ function positionStick(stickOrientation) { inHand = false; Entities.updateAction(stickID, actionID, { relativePosition: offset, - relativeRotation: stickOrientation + relativeRotation: stickOrientation, + hand: "right" }); } -function resetToHand() { // Maybe coordinate with positionStick? +function resetToHand() { // For use with controllers, puts the sword in contact with the hand. + // Maybe coordinate with positionStick? if (inHand) { // Optimization: bail if we're already inHand. return; } @@ -191,14 +193,14 @@ function resetToHand() { // Maybe coordinate with positionStick? }); inHand = true; } +function isControllerActive() { + // I don't think the hydra API provides any reliable way to know whether a particular controller is active. Ask for both. + controllerActive = (Vec3.length(Controller.getSpatialControlPosition(3)) > 0) || Vec3.length(Controller.getSpatialControlPosition(4)) > 0; + return controllerActive; +} function mouseMoveEvent(event) { - if (event.deviceID) { // Not a MOUSE mouse event, but a (e.g., hydra) mouse event, with x/y that is not meaningful for us. - resetToHand(); // Can only happen when controller is uncradled, so let's drive with that, resetting our attachement. - return; - } - controllerActive = (Vec3.length(Controller.getSpatialControlPosition(controllerID)) > 0); - //print("Mouse move with hand controller " + (controllerActive ? "active" : "inactive") + JSON.stringify(event)); - if (controllerActive || !isFighting()) { + // When a controller like the hydra gives a mouse event, the x/y is not meaningful to us, but we can detect with a truty deviceID + if (event.deviceID || !isFighting() || isControllerActive()) { print('Attempting attachment reset'); resetToHand(); return; @@ -244,12 +246,20 @@ function cleanUp(leaveButtons) { } function makeSword() { initControls(); + var swordPosition; + if (!isControllerActive()) { // Dont' knock yourself with sword + swordPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(2, Quat.getFront(MyAvatar.orientation))); + } else if (hand === 'right') { + swordPosition = MyAvatar.getRightPalmPosition(); + } else { + swordPosition = MyAvatar.getLeftPalmPosition(); + } stickID = Entities.addEntity({ type: "Model", modelURL: swordModel, compoundShapeURL: swordCollisionShape, dimensions: dimensions, - position: (hand === 'right') ? MyAvatar.getRightPalmPosition() : MyAvatar.getLeftPalmPosition(), // initial position doesn't matter, as long as it's close + position: swordPosition, rotation: MyAvatar.orientation, damping: 0.1, collisionSoundURL: swordCollisionSoundURL, From 5196648b229e6216e5043f3dbf5eaa50c02b4458 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 14 Jul 2015 09:57:19 -0700 Subject: [PATCH 18/44] Remove obsolete enum member. --- tests/ui/src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ui/src/main.cpp b/tests/ui/src/main.cpp index 07ff40d738..1b0c7e0ab1 100644 --- a/tests/ui/src/main.cpp +++ b/tests/ui/src/main.cpp @@ -125,7 +125,6 @@ public: DisplayModelElementProxy, DisplayDebugTimingDetails, DontDoPrecisionPicking, - RESERVED_DontFadeOnOctreeServerChanges, DontRenderEntitiesAsScene, EchoLocalAudio, EchoServerAudio, From 1c8ec3b1c9c80bd35dfab0aaf0ebe3f6e0bb2d27 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 14 Jul 2015 10:16:06 -0700 Subject: [PATCH 19/44] preventing unused warnings --- libraries/ui/src/VrMenu.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp index 4c83e6e3cd..ce4aba83d3 100644 --- a/libraries/ui/src/VrMenu.cpp +++ b/libraries/ui/src/VrMenu.cpp @@ -211,7 +211,11 @@ void VrMenu::insertAction(QAction* before, QAction* action) { bool invokeResult = QMetaObject::invokeMethod(menu, "insertItem", Qt::DirectConnection, Q_RETURN_ARG(QQuickMenuItem*, returnedValue), Q_ARG(int, index), Q_ARG(QString, action->text())); +#ifndef QT_NO_DEBUG Q_ASSERT(invokeResult); +#else + Q_UNUSED(invokeResult); +#endif result = reinterpret_cast(returnedValue); } Q_ASSERT(result); From a32f54da2f04747776d6d7b101d1e89bc9c86d90 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 12:36:18 -0700 Subject: [PATCH 20/44] Cleanup --- interface/src/main.cpp | 1 - libraries/model/src/model/Skybox.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 2347b3b1d6..e591034fb5 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include diff --git a/libraries/model/src/model/Skybox.cpp b/libraries/model/src/model/Skybox.cpp index f33891c478..0fb2458f01 100755 --- a/libraries/model/src/model/Skybox.cpp +++ b/libraries/model/src/model/Skybox.cpp @@ -101,7 +101,7 @@ void Skybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const Sky batch.setModelTransform(Transform()); // only for Mac batch.setPipeline(thePipeline); batch.setInputBuffer(gpu::Stream::POSITION, theBuffer, 0, 8); - //batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); + batch.setUniformBuffer(SKYBOX_CONSTANTS_SLOT, theConstants, 0, theConstants->getSize()); batch.setInputFormat(theFormat); batch.setResourceTexture(0, skybox.getCubemap()); batch.draw(gpu::TRIANGLE_STRIP, 4); From 3cd1e318b2bd93c18bfbfbe377964594934f1b25 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 14 Jul 2015 13:15:24 -0700 Subject: [PATCH 21/44] Fix https://app.asana.com/0/32622044445063/39927009585710 --- libraries/fbx/src/FSTReader.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/fbx/src/FSTReader.cpp index a62c0fcea2..6f5d0d7ec5 100644 --- a/libraries/fbx/src/FSTReader.cpp +++ b/libraries/fbx/src/FSTReader.cpp @@ -93,7 +93,16 @@ QByteArray FSTReader::writeMapping(const QVariantHash& mapping) { for (auto key : PREFERED_ORDER) { auto it = mapping.find(key); if (it != mapping.constEnd()) { - writeVariant(buffer, it); + if (key == FREE_JOINT_FIELD) { // writeVariant does not handle strings added using insertMulti. + for (auto multi : mapping.values(key)) { + buffer.write(key.toUtf8()); + buffer.write(" = "); + buffer.write(multi.toByteArray()); + buffer.write("\n"); + } + } else { + writeVariant(buffer, it); + } } } From bfad3ee02a0a8ebca3519e223f7e1deaed8e79a2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 14 Jul 2015 14:07:32 -0700 Subject: [PATCH 22/44] Fix eye directions so that they're correct when avatar leans backwards --- interface/src/avatar/FaceModel.cpp | 12 ++---- libraries/avatars/src/AvatarData.cpp | 45 ++++++++++++++-------- libraries/networking/src/PacketHeaders.cpp | 2 +- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/interface/src/avatar/FaceModel.cpp b/interface/src/avatar/FaceModel.cpp index 1501c52de5..170965bb4d 100644 --- a/interface/src/avatar/FaceModel.cpp +++ b/interface/src/avatar/FaceModel.cpp @@ -56,18 +56,14 @@ void FaceModel::maybeUpdateNeckRotation(const JointState& parentState, const FBX glm::translate(state.getDefaultTranslationInConstrainedFrame()) * joint.preTransform * glm::mat4_cast(joint.preRotation))); glm::vec3 pitchYawRoll = safeEulerAngles(_owningHead->getFinalOrientationInLocalFrame()); - if (owningAvatar->isMyAvatar()) { - glm::vec3 lean = glm::radians(glm::vec3(_owningHead->getFinalLeanForward(), - _owningHead->getTorsoTwist(), - _owningHead->getFinalLeanSideways())); - pitchYawRoll -= lean; - } - + glm::vec3 lean = glm::radians(glm::vec3(_owningHead->getFinalLeanForward(), + _owningHead->getTorsoTwist(), + _owningHead->getFinalLeanSideways())); + pitchYawRoll -= lean; state.setRotationInConstrainedFrame(glm::angleAxis(-pitchYawRoll.z, glm::normalize(inverse * axes[2])) * glm::angleAxis(pitchYawRoll.y, glm::normalize(inverse * axes[1])) * glm::angleAxis(-pitchYawRoll.x, glm::normalize(inverse * axes[0])) * joint.rotation, DEFAULT_PRIORITY); - } void FaceModel::maybeUpdateEyeRotation(Model* model, const JointState& parentState, const FBXJoint& joint, JointState& state) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9a6400ae16..a7fdcdeafd 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -161,19 +161,15 @@ QByteArray AvatarData::toByteArray() { // Body scale destinationBuffer += packFloatRatioToTwoByte(destinationBuffer, _targetScale); - // Head rotation (NOTE: This needs to become a quaternion to save two bytes) - glm::vec3 pitchYawRoll = glm::vec3(_headData->getFinalPitch(), - _headData->getFinalYaw(), - _headData->getFinalRoll()); - if (this->isMyAvatar()) { - glm::vec3 lean = glm::vec3(_headData->getFinalLeanForward(), - _headData->getTorsoTwist(), - _headData->getFinalLeanSideways()); - pitchYawRoll -= lean; - } - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, pitchYawRoll.x); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, pitchYawRoll.y); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, pitchYawRoll.z); + // Head rotation + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalPitch()); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalYaw()); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalRoll()); + + // Body lean + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); @@ -291,13 +287,16 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { // headPitch = 2 (compressed float) // headYaw = 2 (compressed float) // headRoll = 2 (compressed float) + // leanForward = 2 (compressed float) + // leanSideways = 2 (compressed float) + // torsoTwist = 2 (compressed float) // lookAt = 12 // audioLoudness = 4 // } // + 1 byte for pupilSize // + 1 byte for numJoints (0) - // = 45 bytes - int minPossibleSize = 45; + // = 51 bytes + int minPossibleSize = 51; int maxAvailableSize = packet.size() - offset; if (minPossibleSize > maxAvailableSize) { @@ -371,6 +370,22 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _headData->setBaseYaw(headYaw); _headData->setBaseRoll(headRoll); } // 6 bytes + + { // Head lean (relative to pelvis) + float leanForward, leanSideways, torsoTwist; + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanForward); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanSideways); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &torsoTwist); + if (glm::isnan(leanForward) || glm::isnan(leanSideways)) { + if (shouldLogError(now)) { + qCDebug(avatars) << "Discard nan AvatarData::leanForward,leanSideways,torsoTwise; displayName = '" << _displayName << "'"; + } + return maxAvailableSize; + } + _headData->_leanForward = leanForward; + _headData->_leanSideways = leanSideways; + _headData->_torsoTwist = torsoTwist; + } // 6 bytes { // Lookat Position glm::vec3 lookAt; diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 42ee9f3025..74b6aa55f1 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -55,7 +55,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketTypeInjectAudio: return 1; case PacketTypeAvatarData: - return 6; + return 7; case PacketTypeAvatarIdentity: return 1; case PacketTypeEnvironmentData: From 22f0dbdefb4efcb3f37f8f2ac775cbdee9132e67 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 15:16:00 -0700 Subject: [PATCH 23/44] CR --- libraries/animation/src/AnimationCache.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/animation/src/AnimationCache.cpp b/libraries/animation/src/AnimationCache.cpp index 9eb68cedc2..99224f7dce 100644 --- a/libraries/animation/src/AnimationCache.cpp +++ b/libraries/animation/src/AnimationCache.cpp @@ -38,9 +38,7 @@ QSharedPointer AnimationCache::createResource(const QUrl& url, const Q return QSharedPointer(new Animation(url), &Resource::allReferencesCleared); } -Animation::Animation(const QUrl& url) : - Resource(url) { -} +Animation::Animation(const QUrl& url) : Resource(url) {} class AnimationReader : public QRunnable { public: From 68f4fe6566515cc9440ae8f6ee490648c14ec3b4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 16:03:44 -0700 Subject: [PATCH 24/44] fix lagging touch events --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index aa978f3464..de99940d51 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1853,7 +1853,7 @@ void Application::idle() { } // After finishing all of the above work, ensure the idle timer is set to the proper interval, // depending on whether we're throttling or not - idleTimer->start(_glWidget->isThrottleRendering() ? THROTTLED_IDLE_TIMER_DELAY : 0); + idleTimer->start(_glWidget->isThrottleRendering() ? THROTTLED_IDLE_TIMER_DELAY : 1); } // check for any requested background downloads. From bc251de43c241fa4555f172aa9c73d36f5bbc761 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 16:49:22 -0700 Subject: [PATCH 25/44] delete dead code --- libraries/networking/src/NetworkPacket.cpp | 13 ------------- libraries/networking/src/NetworkPacket.h | 6 ------ libraries/octree/src/JurisdictionMap.cpp | 17 ----------------- libraries/octree/src/JurisdictionMap.h | 6 ------ 4 files changed, 42 deletions(-) diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp index 69bd0962bf..e99ef1ab8b 100644 --- a/libraries/networking/src/NetworkPacket.cpp +++ b/libraries/networking/src/NetworkPacket.cpp @@ -40,16 +40,3 @@ NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { copyContents(other.getNode(), other.getByteArray()); return *this; } - -#ifdef HAS_MOVE_SEMANTICS -// move, same as copy, but other packet won't be used further -NetworkPacket::NetworkPacket(NetworkPacket && packet) { - copyContents(packet.getNode(), packet.getByteArray()); -} - -// move assignment -NetworkPacket& NetworkPacket::operator=(NetworkPacket&& other) { - copyContents(other.getNode(), other.getByteArray()); - return *this; -} -#endif diff --git a/libraries/networking/src/NetworkPacket.h b/libraries/networking/src/NetworkPacket.h index caee42f126..a7e5a6b3cd 100644 --- a/libraries/networking/src/NetworkPacket.h +++ b/libraries/networking/src/NetworkPacket.h @@ -22,12 +22,6 @@ public: NetworkPacket() { } NetworkPacket(const NetworkPacket& packet); // copy constructor NetworkPacket& operator= (const NetworkPacket& other); // copy assignment - -#ifdef HAS_MOVE_SEMANTICS - NetworkPacket(NetworkPacket&& packet); // move?? // same as copy, but other packet won't be used further - NetworkPacket& operator= (NetworkPacket&& other); // move assignment -#endif - NetworkPacket(const SharedNodePointer& node, const QByteArray& byteArray); const SharedNodePointer& getNode() const { return _node; } diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 46e758cb42..f1a0fd2a38 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -30,23 +30,6 @@ JurisdictionMap& JurisdictionMap::operator=(const JurisdictionMap& other) { return *this; } -#ifdef HAS_MOVE_SEMANTICS -// Move constructor -JurisdictionMap::JurisdictionMap(JurisdictionMap&& other) : _rootOctalCode(NULL) { - init(other._rootOctalCode, other._endNodes); - other._rootOctalCode = NULL; - other._endNodes.clear(); -} - -// move assignment -JurisdictionMap& JurisdictionMap::operator=(JurisdictionMap&& other) { - init(other._rootOctalCode, other._endNodes); - other._rootOctalCode = NULL; - other._endNodes.clear(); - return *this; -} -#endif - // Copy constructor JurisdictionMap::JurisdictionMap(const JurisdictionMap& other) : _rootOctalCode(NULL) { copyContents(other); diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index ba75e3102b..ed4ceb79c0 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -37,12 +37,6 @@ public: // standard assignment JurisdictionMap& operator=(const JurisdictionMap& other); // copy assignment -#ifdef HAS_MOVE_SEMANTICS - // move constructor and assignment - JurisdictionMap(JurisdictionMap&& other); // move constructor - JurisdictionMap& operator= (JurisdictionMap&& other); // move assignment -#endif - // application constructors JurisdictionMap(const char* filename); JurisdictionMap(unsigned char* rootOctalCode, const std::vector& endNodes); From d19c7125daad7bf017593b63e0fc4cf46d41524d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 16:49:43 -0700 Subject: [PATCH 26/44] remove naked gl calls --- libraries/render-utils/src/GeometryCache.cpp | 102 ------------------- libraries/render-utils/src/GeometryCache.h | 2 - 2 files changed, 104 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 14890bd154..7cb882acc1 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -55,8 +55,6 @@ const int NUM_VERTICES_PER_TRIANGLE = 3; const int NUM_TRIANGLES_PER_QUAD = 2; const int NUM_VERTICES_PER_TRIANGULATED_QUAD = NUM_VERTICES_PER_TRIANGLE * NUM_TRIANGLES_PER_QUAD; const int NUM_COORDS_PER_VERTEX = 3; -const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat); -const int NUM_BYTES_PER_INDEX = sizeof(GLushort); void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid, int id) { gpu::Batch batch; @@ -308,106 +306,6 @@ void GeometryCache::renderSphere(gpu::Batch& batch, float radius, int slices, in } } -void GeometryCache::renderCone(float base, float height, int slices, int stacks) { - VerticesIndices& vbo = _coneVBOs[IntPair(slices, stacks)]; - int vertices = (stacks + 2) * slices; - int baseTriangles = slices - 2; - int indices = NUM_VERTICES_PER_TRIANGULATED_QUAD * slices * stacks + NUM_VERTICES_PER_TRIANGLE * baseTriangles; - if (vbo.first == 0) { - GLfloat* vertexData = new GLfloat[vertices * NUM_COORDS_PER_VERTEX * 2]; - GLfloat* vertex = vertexData; - // cap - for (int i = 0; i < slices; i++) { - float theta = TWO_PI * i / slices; - - //normals - *(vertex++) = 0.0f; - *(vertex++) = 0.0f; - *(vertex++) = -1.0f; - - // vertices - *(vertex++) = cosf(theta); - *(vertex++) = sinf(theta); - *(vertex++) = 0.0f; - } - // body - for (int i = 0; i <= stacks; i++) { - float z = (float)i / stacks; - float radius = 1.0f - z; - - for (int j = 0; j < slices; j++) { - float theta = TWO_PI * j / slices; - - //normals - *(vertex++) = cosf(theta) / SQUARE_ROOT_OF_2; - *(vertex++) = sinf(theta) / SQUARE_ROOT_OF_2; - *(vertex++) = 1.0f / SQUARE_ROOT_OF_2; - - // vertices - *(vertex++) = radius * cosf(theta); - *(vertex++) = radius * sinf(theta); - *(vertex++) = z; - } - } - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, 2 * vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < baseTriangles; i++) { - *(index++) = 0; - *(index++) = i + 2; - *(index++) = i + 1; - } - for (int i = 1; i <= stacks; i++) { - GLushort bottom = i * slices; - GLushort top = bottom + slices; - for (int j = 0; j < slices; j++) { - int next = (j + 1) % slices; - - *(index++) = bottom + j; - *(index++) = top + next; - *(index++) = top + j; - - *(index++) = bottom + j; - *(index++) = bottom + next; - *(index++) = top + next; - } - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - int stride = NUM_VERTICES_PER_TRIANGULATED_QUAD * sizeof(float); - glNormalPointer(GL_FLOAT, stride, 0); - glVertexPointer(NUM_COORDS_PER_VERTEX, GL_FLOAT, stride, (const void *)(NUM_COORDS_PER_VERTEX * sizeof(float))); - - glPushMatrix(); - glScalef(base, base, height); - - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - - glPopMatrix(); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} - void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { gpu::Batch batch; renderGrid(batch, xDivisions, yDivisions, color); diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 83891bbf49..2e64489c3e 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -133,8 +133,6 @@ public: int allocateID() { return _nextID++; } static const int UNKNOWN_ID; - void renderCone(float base, float height, int slices, int stacks); - void renderSphere(float radius, int slices, int stacks, const glm::vec3& color, bool solid = true, int id = UNKNOWN_ID) { renderSphere(radius, slices, stacks, glm::vec4(color, 1.0f), solid, id); } void renderSphere(gpu::Batch& batch, float radius, int slices, int stacks, const glm::vec3& color, bool solid = true, int id = UNKNOWN_ID) From 23b89a6f7d04b82516f10fdd1015bae6a8a41b64 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 17:04:07 -0700 Subject: [PATCH 27/44] remove naked gl/dead code from line and cube overlays --- interface/src/ui/overlays/Cube3DOverlay.cpp | 87 --------------------- interface/src/ui/overlays/Line3DOverlay.cpp | 33 -------- 2 files changed, 120 deletions(-) diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 7eb9a5b414..433a55e231 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -104,93 +104,6 @@ void Cube3DOverlay::render(RenderArgs* args) { DependencyManager::get()->renderWireCube(*batch, 1.0f, cubeColor); } } - } else { - float glowLevel = getGlowLevel(); - Glower* glower = NULL; - if (glowLevel > 0.0f) { - glower = new Glower(glowLevel); - } - - glPushMatrix(); - glTranslatef(position.x, position.y, position.z); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - glPushMatrix(); - glm::vec3 positionToCenter = center - position; - glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); - if (_isSolid) { - if (_borderSize > 0) { - // Draw a cube at a larger size behind the main cube, creating - // a border effect. - // Disable writing to the depth mask so that the "border" cube will not - // occlude the main cube. This means the border could be covered by - // overlays that are further back and drawn later, but this is good - // enough for the use-case. - glDepthMask(GL_FALSE); - glPushMatrix(); - glScalef(dimensions.x * _borderSize, dimensions.y * _borderSize, dimensions.z * _borderSize); - - if (_drawOnHUD) { - DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(1.0f, 1.0f, 1.0f, alpha)); - } else { - DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(1.0f, 1.0f, 1.0f, alpha)); - } - - glPopMatrix(); - glDepthMask(GL_TRUE); - } - - glPushMatrix(); - glScalef(dimensions.x, dimensions.y, dimensions.z); - if (_drawOnHUD) { - DependencyManager::get()->renderSolidCube(1.0f, cubeColor); - } else { - DependencyManager::get()->renderSolidCube(1.0f, cubeColor); - } - glPopMatrix(); - } else { - glLineWidth(_lineWidth); - - if (getIsDashedLine()) { - glm::vec3 halfDimensions = dimensions / 2.0f; - glm::vec3 bottomLeftNear(-halfDimensions.x, -halfDimensions.y, -halfDimensions.z); - glm::vec3 bottomRightNear(halfDimensions.x, -halfDimensions.y, -halfDimensions.z); - glm::vec3 topLeftNear(-halfDimensions.x, halfDimensions.y, -halfDimensions.z); - glm::vec3 topRightNear(halfDimensions.x, halfDimensions.y, -halfDimensions.z); - - glm::vec3 bottomLeftFar(-halfDimensions.x, -halfDimensions.y, halfDimensions.z); - glm::vec3 bottomRightFar(halfDimensions.x, -halfDimensions.y, halfDimensions.z); - glm::vec3 topLeftFar(-halfDimensions.x, halfDimensions.y, halfDimensions.z); - glm::vec3 topRightFar(halfDimensions.x, halfDimensions.y, halfDimensions.z); - - auto geometryCache = DependencyManager::get(); - - geometryCache->renderDashedLine(bottomLeftNear, bottomRightNear, cubeColor); - geometryCache->renderDashedLine(bottomRightNear, bottomRightFar, cubeColor); - geometryCache->renderDashedLine(bottomRightFar, bottomLeftFar, cubeColor); - geometryCache->renderDashedLine(bottomLeftFar, bottomLeftNear, cubeColor); - - geometryCache->renderDashedLine(topLeftNear, topRightNear, cubeColor); - geometryCache->renderDashedLine(topRightNear, topRightFar, cubeColor); - geometryCache->renderDashedLine(topRightFar, topLeftFar, cubeColor); - geometryCache->renderDashedLine(topLeftFar, topLeftNear, cubeColor); - - geometryCache->renderDashedLine(bottomLeftNear, topLeftNear, cubeColor); - geometryCache->renderDashedLine(bottomRightNear, topRightNear, cubeColor); - geometryCache->renderDashedLine(bottomLeftFar, topLeftFar, cubeColor); - geometryCache->renderDashedLine(bottomRightFar, topRightFar, cubeColor); - - } else { - glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderWireCube(1.0f, cubeColor); - } - } - glPopMatrix(); - glPopMatrix(); - - if (glower) { - delete glower; - } } } diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 0bb32b9d6e..0abc86d7ad 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -53,7 +53,6 @@ void Line3DOverlay::render(RenderArgs* args) { glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); auto batch = args->_batch; - if (batch) { batch->setModelTransform(_transform); @@ -63,38 +62,6 @@ void Line3DOverlay::render(RenderArgs* args) { } else { DependencyManager::get()->renderLine(*batch, _start, _end, colorv4, _geometryCacheID); } - } else { - float glowLevel = getGlowLevel(); - Glower* glower = NULL; - if (glowLevel > 0.0f) { - glower = new Glower(glowLevel); - } - - glPushMatrix(); - - glDisable(GL_LIGHTING); - glLineWidth(_lineWidth); - - glm::vec3 position = getPosition(); - glm::quat rotation = getRotation(); - - glTranslatef(position.x, position.y, position.z); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - - if (getIsDashedLine()) { - // TODO: add support for color to renderDashedLine() - DependencyManager::get()->renderDashedLine(_start, _end, colorv4, _geometryCacheID); - } else { - DependencyManager::get()->renderLine(_start, _end, colorv4, _geometryCacheID); - } - glEnable(GL_LIGHTING); - - glPopMatrix(); - - if (glower) { - delete glower; - } } } From f1b85aefa9633b797ce6673414b44dd9f5edb82f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 17:59:20 -0700 Subject: [PATCH 28/44] more dead code removal: NodeBounds --- interface/src/Application.cpp | 3 - interface/src/Application.h | 5 - interface/src/Menu.cpp | 8 -- interface/src/ui/ApplicationOverlay.cpp | 13 -- interface/src/ui/NodeBounds.cpp | 183 ------------------------ interface/src/ui/NodeBounds.h | 47 ------ 6 files changed, 259 deletions(-) delete mode 100644 interface/src/ui/NodeBounds.cpp delete mode 100644 interface/src/ui/NodeBounds.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a0a4af29f6..65615a65b0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -337,7 +337,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _mousePressed(false), _enableProcessOctreeThread(true), _octreeProcessor(), - _nodeBoundsDisplay(this), _runningScriptsWidget(NULL), _runningScriptsWidgetWasVisible(false), _trayIcon(new QSystemTrayIcon(_window)), @@ -3587,8 +3586,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } if (!selfAvatarOnly) { - _nodeBoundsDisplay.draw(); - // give external parties a change to hook in { PerformanceTimer perfTimer("inWorldInterface"); diff --git a/interface/src/Application.h b/interface/src/Application.h index 55dbaf7f27..44ead54563 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -60,7 +60,6 @@ #include "ui/BandwidthDialog.h" #include "ui/HMDToolsDialog.h" #include "ui/ModelsBrowser.h" -#include "ui/NodeBounds.h" #include "ui/OctreeStatsDialog.h" #include "ui/SnapshotShareDialog.h" #include "ui/LodToolsDialog.h" @@ -303,8 +302,6 @@ public: virtual void endOverrideEnvironmentData() { _environment.endOverride(); } virtual qreal getDevicePixelRatio(); - NodeBounds& getNodeBoundsDisplay() { return _nodeBoundsDisplay; } - FileLogger* getLogger() { return _logger; } glm::vec2 getViewportDimensions() const; @@ -621,8 +618,6 @@ private: NodeToOctreeSceneStats _octreeServerSceneStats; QReadWriteLock _octreeSceneStatsLock; - NodeBounds _nodeBoundsDisplay; - ControllerScriptingInterface _controllerScriptingInterface; QPointer _logDialog; QPointer _snapshotShareDialog; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ff6a144fce..60311904de 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -37,7 +37,6 @@ #include "SpeechRecognizer.h" #endif #include "ui/DialogsManager.h" -#include "ui/NodeBounds.h" #include "ui/StandAloneJSConsole.h" #include "InterfaceLogging.h" @@ -316,13 +315,6 @@ Menu::Menu() { qApp, SLOT(setEnable3DTVMode(bool))); - - MenuWrapper* nodeBordersMenu = viewMenu->addMenu("Server Borders"); - NodeBounds& nodeBounds = qApp->getNodeBoundsDisplay(); - addCheckableActionToQMenuAndActionHash(nodeBordersMenu, MenuOption::ShowBordersEntityNodes, - Qt::CTRL | Qt::SHIFT | Qt::Key_1, false, - &nodeBounds, SLOT(setShowEntityNodes(bool))); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::TurnWithHead, 0, false); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 44904a8655..b28c5c83a2 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -165,19 +165,6 @@ void ApplicationOverlay::renderStatsAndLogs(RenderArgs* renderArgs) { drawText(canvasSize.x - 100, canvasSize.y - timerBottom, 0.30f, 0.0f, 0, frameTimer.toUtf8().constData(), WHITE_TEXT); } - - glPointSize(1.0f); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - NodeBounds& nodeBoundsDisplay = qApp->getNodeBoundsDisplay(); - nodeBoundsDisplay.drawOverlay(); - glEnable(GL_DEPTH_TEST); - glEnable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); - fboViewport(_overlayFramebuffer); */ } diff --git a/interface/src/ui/NodeBounds.cpp b/interface/src/ui/NodeBounds.cpp deleted file mode 100644 index 2b1b2f56e1..0000000000 --- a/interface/src/ui/NodeBounds.cpp +++ /dev/null @@ -1,183 +0,0 @@ -// -// NodeBounds.cpp -// interface/src/ui -// -// Created by Ryan Huffman on 05/14/14. -// Copyright 2014 High Fidelity, Inc. -// -// This class draws a border around the different Entity nodes on the current domain, -// and a semi-transparent cube around the currently mouse-overed node. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include -#include - -#include "Application.h" -#include "Util.h" - -#include "NodeBounds.h" - -NodeBounds::NodeBounds(QObject* parent) : - QObject(parent), - _showEntityNodes(false), - _overlayText() { - -} - -void NodeBounds::draw() { - if (!_showEntityNodes) { - _overlayText[0] = '\0'; - return; - } - - NodeToJurisdictionMap& entityServerJurisdictions = Application::getInstance()->getEntityServerJurisdictions(); - NodeToJurisdictionMap* serverJurisdictions; - - // Compute ray to find selected nodes later on. We can't use the pre-computed ray in Application because it centers - // itself after the cursor disappears. - PickRay pickRay = qApp->computePickRay(); - - // Variables to keep track of the selected node and properties to draw the cube later if needed - Node* selectedNode = NULL; - float selectedDistance = FLT_MAX; - bool selectedIsInside = true; - glm::vec3 selectedCenter; - float selectedScale = 0; - - auto nodeList = DependencyManager::get(); - nodeList->eachNode([&](const SharedNodePointer& node){ - NodeType_t nodeType = node->getType(); - - if (nodeType == NodeType::EntityServer && _showEntityNodes) { - serverJurisdictions = &entityServerJurisdictions; - } else { - return; - } - - QUuid nodeUUID = node->getUUID(); - serverJurisdictions->lockForRead(); - if (serverJurisdictions->find(nodeUUID) != serverJurisdictions->end()) { - const JurisdictionMap& map = (*serverJurisdictions)[nodeUUID]; - - unsigned char* rootCode = map.getRootOctalCode(); - - if (rootCode) { - VoxelPositionSize rootDetails; - voxelDetailsForCode(rootCode, rootDetails); - serverJurisdictions->unlock(); - glm::vec3 location(rootDetails.x, rootDetails.y, rootDetails.z); - - AACube serverBounds(location, rootDetails.s); - - glm::vec3 center = serverBounds.getVertex(BOTTOM_RIGHT_NEAR) - + ((serverBounds.getVertex(TOP_LEFT_FAR) - serverBounds.getVertex(BOTTOM_RIGHT_NEAR)) / 2.0f); - - const float ENTITY_NODE_SCALE = 0.99f; - - float scaleFactor = rootDetails.s; - - // Scale by 0.92 - 1.00 depending on the scale of the node. This allows smaller nodes to scale in - // a bit and not overlap larger nodes. - scaleFactor *= 0.92f + (rootDetails.s * 0.08f); - - // Scale different node types slightly differently because it's common for them to overlap. - if (nodeType == NodeType::EntityServer) { - scaleFactor *= ENTITY_NODE_SCALE; - } - - float red, green, blue; - getColorForNodeType(nodeType, red, green, blue); - drawNodeBorder(center, scaleFactor, red, green, blue); - - float distance; - BoxFace face; - - bool inside = serverBounds.contains(pickRay.origin); - bool colliding = serverBounds.findRayIntersection(pickRay.origin, pickRay.direction, distance, face); - - // If the camera is inside a node it will be "selected" if you don't have your cursor over another node - // that you aren't inside. - if (colliding && (!selectedNode || (!inside && (distance < selectedDistance || selectedIsInside)))) { - selectedNode = node.data(); - selectedDistance = distance; - selectedIsInside = inside; - selectedCenter = center; - selectedScale = scaleFactor; - } - } else { - serverJurisdictions->unlock(); - } - } else { - serverJurisdictions->unlock(); - } - }); - - if (selectedNode) { - glPushMatrix(); - - glTranslatef(selectedCenter.x, selectedCenter.y, selectedCenter.z); - glScalef(selectedScale, selectedScale, selectedScale); - - float red, green, blue; - getColorForNodeType(selectedNode->getType(), red, green, blue); - - DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(red, green, blue, 0.2f)); - - glPopMatrix(); - - HifiSockAddr addr = selectedNode->getPublicSocket(); - QString overlay = QString("%1:%2 %3ms") - .arg(addr.getAddress().toString()) - .arg(addr.getPort()) - .arg(selectedNode->getPingMs()) - .left(MAX_OVERLAY_TEXT_LENGTH); - - // Ideally we'd just use a QString, but I ran into weird blinking issues using - // constData() directly, as if the data was being overwritten. - strcpy(_overlayText, overlay.toLocal8Bit().constData()); - } else { - _overlayText[0] = '\0'; - } -} - -void NodeBounds::drawNodeBorder(const glm::vec3& center, float scale, float red, float green, float blue) { - glPushMatrix(); - glTranslatef(center.x, center.y, center.z); - glScalef(scale, scale, scale); - glLineWidth(2.5); - DependencyManager::get()->renderWireCube(1.0f, glm::vec4(red, green, blue, 1.0f)); - glPopMatrix(); -} - -void NodeBounds::getColorForNodeType(NodeType_t nodeType, float& red, float& green, float& blue) { - red = nodeType == 0.0; - green = 0.0; - blue = nodeType == NodeType::EntityServer ? 1.0 : 0.0; -} - -void NodeBounds::drawOverlay() { - if (strlen(_overlayText) > 0) { - Application* application = Application::getInstance(); - - const float TEXT_COLOR[] = { 0.90f, 0.90f, 0.90f }; - const float TEXT_SCALE = 0.1f; - const int TEXT_HEIGHT = 10; - const float ROTATION = 0.0f; - const int FONT = 2; - const int PADDING = 10; - const int MOUSE_OFFSET = 10; - const int BACKGROUND_BEVEL = 3; - - int mouseX = application->getTrueMouseX(), - mouseY = application->getTrueMouseY(), - textWidth = widthText(TEXT_SCALE, 0, _overlayText); - DependencyManager::get()->renderBevelCornersRect( - mouseX + MOUSE_OFFSET, mouseY - TEXT_HEIGHT - PADDING, - textWidth + (2 * PADDING), TEXT_HEIGHT + (2 * PADDING), BACKGROUND_BEVEL, - glm::vec4(0.4f, 0.4f, 0.4f, 0.6f)); - drawText(mouseX + MOUSE_OFFSET + PADDING, mouseY, TEXT_SCALE, ROTATION, FONT, _overlayText, TEXT_COLOR); - } -} diff --git a/interface/src/ui/NodeBounds.h b/interface/src/ui/NodeBounds.h deleted file mode 100644 index 66255a6432..0000000000 --- a/interface/src/ui/NodeBounds.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// NodeBounds.h -// interface/src/ui -// -// Created by Ryan Huffman on 05/14/14. -// Copyright 2014 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_NodeBounds_h -#define hifi_NodeBounds_h - -#include - -#include - -const int MAX_OVERLAY_TEXT_LENGTH = 64; - -class NodeBounds : public QObject { - Q_OBJECT -public: - NodeBounds(QObject* parent = NULL); - - bool getShowEntityNodes() { return _showEntityNodes; } - bool getShowParticleNodes() { return _showParticleNodes; } - - void draw(); - void drawOverlay(); - -public slots: - void setShowEntityNodes(bool value) { _showEntityNodes = value; } - void setShowParticleNodes(bool value) { _showParticleNodes = value; } - -protected: - void drawNodeBorder(const glm::vec3& center, float scale, float red, float green, float blue); - void getColorForNodeType(NodeType_t nodeType, float& red, float& green, float& blue); - -private: - bool _showEntityNodes; - bool _showParticleNodes; - char _overlayText[MAX_OVERLAY_TEXT_LENGTH + 1]; - -}; - -#endif // hifi_NodeBounds_h From 47dad82d50a34e8ee4f73425343aed6a58e7bdb3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 18:09:58 -0700 Subject: [PATCH 29/44] removed dead code --- libraries/render-utils/src/RenderUtil.h | 50 ------------------------- 1 file changed, 50 deletions(-) diff --git a/libraries/render-utils/src/RenderUtil.h b/libraries/render-utils/src/RenderUtil.h index 8c1b1e12e7..b2f244733a 100644 --- a/libraries/render-utils/src/RenderUtil.h +++ b/libraries/render-utils/src/RenderUtil.h @@ -15,54 +15,4 @@ /// Renders a quad from (-1, -1, 0) to (1, 1, 0) with texture coordinates from (sMin, tMin) to (sMax, tMax). void renderFullscreenQuad(float sMin = 0.0f, float sMax = 1.0f, float tMin = 0.0f, float tMax = 1.0f); -template -void withMatrixPush(F f) { - glMatrixMode(matrix); - glPushMatrix(); - f(); - glPopMatrix(); -} - -template -void withProjectionPush(F f) { - withMatrixPush(f); -} - -template -void withProjectionIdentity(F f) { - withProjectionPush([&] { - glLoadIdentity(); - f(); - }); -} - -template -void withProjectionMatrix(GLfloat* matrix, F f) { - withProjectionPush([&] { - glLoadMatrixf(matrix); - f(); - }); -} - -template -void withModelviewPush(F f) { - withMatrixPush(f); -} - -template -void withModelviewIdentity(F f) { - withModelviewPush([&] { - glLoadIdentity(); - f(); - }); -} - -template -void withModelviewMatrix(GLfloat* matrix, F f) { - withModelviewPush([&] { - glLoadMatrixf(matrix); - f(); - }); -} - #endif // hifi_RenderUtil_h From 5a927c4c90829fd312cd9428dc73b69376a4c78d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 18:25:50 -0700 Subject: [PATCH 30/44] remove dead code --- interface/src/avatar/MyAvatar.cpp | 22 ---------------------- interface/src/avatar/MyAvatar.h | 1 - 2 files changed, 23 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 79c600b7ec..e532890b25 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -323,28 +323,6 @@ void MyAvatar::updateFromTrackers(float deltaTime) { } -void MyAvatar::renderDebugBodyPoints() { - glm::vec3 torsoPosition(getPosition()); - glm::vec3 headPosition(getHead()->getEyePosition()); - float torsoToHead = glm::length(headPosition - torsoPosition); - glm::vec3 position; - qCDebug(interfaceapp, "head-above-torso %.2f, scale = %0.2f", (double)torsoToHead, (double)getScale()); - - // Torso Sphere - position = torsoPosition; - glPushMatrix(); - glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderSphere(0.2f, 10.0f, 10.0f, glm::vec4(0, 1, 0, .5f)); - glPopMatrix(); - - // Head Sphere - position = headPosition; - glPushMatrix(); - glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderSphere(0.15f, 10.0f, 10.0f, glm::vec4(0, 1, 0, .5f)); - glPopMatrix(); -} - // virtual void MyAvatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting) { // don't render if we've been asked to disable local rendering diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 34dfcad2ad..a2566118f2 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -48,7 +48,6 @@ public: virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false) override; virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f) override; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const override; - void renderDebugBodyPoints(); // setters void setLeanScale(float scale) { _leanScale = scale; } From 440464f884ee6042dcb7fa30d4b02691441ddf84 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 14 Jul 2015 18:35:11 -0700 Subject: [PATCH 31/44] Trying to improve the GLBackendINtpu cahce a bit and thinking about moving to core profile --- interface/src/ui/ApplicationOverlay.cpp | 2 +- libraries/gpu/src/gpu/Batch.h | 5 +- libraries/gpu/src/gpu/GLBackend.cpp | 2 + libraries/gpu/src/gpu/GLBackend.h | 28 ++- libraries/gpu/src/gpu/GLBackendInput.cpp | 232 ++++++++++++------- libraries/gpu/src/gpu/GLBackendShader.cpp | 19 +- libraries/gpu/src/gpu/GLBackendTransform.cpp | 9 +- 7 files changed, 202 insertions(+), 95 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 44904a8655..c28aa272ea 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -109,7 +109,7 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { batch._glBindTexture(GL_TEXTURE_2D, _uiTexture); geometryCache->renderUnitQuad(batch, glm::vec4(1)); renderArgs->_context->syncCache(); - renderArgs->_context->render(batch); + // renderArgs->_context->render(batch); } } diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index abd9982cd0..bf6883e3a9 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -40,11 +40,8 @@ namespace gpu { enum ReservedSlot { -/* TRANSFORM_OBJECT_SLOT = 6, + TRANSFORM_OBJECT_SLOT = 6, TRANSFORM_CAMERA_SLOT = 7, - */ - TRANSFORM_OBJECT_SLOT = 1, - TRANSFORM_CAMERA_SLOT = 2, }; class Batch { diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index b79f506544..adbef7cb31 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -87,10 +87,12 @@ GLBackend::GLBackend() : _pipeline(), _output() { + initInput(); initTransform(); } GLBackend::~GLBackend() { + killInput(); killTransform(); } diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 8df55a7f67..491897b281 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -228,7 +228,21 @@ public: void do_setStateColorWriteMask(uint32 mask); + // Repporting stats of the context + class Stats { + public: + int _ISNumFormatChanges = 0; + int _ISNumInputBufferChanges = 0; + int _ISNumIndexBufferChanges = 0; + + Stats() {} + Stats(const Stats& stats) = default; + }; + + void getStats(Stats& stats) const { stats = _stats; } + protected: + Stats _stats; // Draw Stage void do_draw(Batch& batch, uint32 paramOffset); @@ -242,12 +256,13 @@ protected: void do_setInputFormat(Batch& batch, uint32 paramOffset); void do_setInputBuffer(Batch& batch, uint32 paramOffset); void do_setIndexBuffer(Batch& batch, uint32 paramOffset); - - // Synchronize the state cache of this Backend with the actual real state of the GL Context + + void initInput(); + void killInput(); void syncInputStateCache(); void updateInput(); struct InputStageState { - bool _invalidFormat; + bool _invalidFormat = true; Stream::FormatPointer _format; typedef std::bitset BuffersState; @@ -256,6 +271,7 @@ protected: Buffers _buffers; Offsets _bufferOffsets; Offsets _bufferStrides; + std::vector _bufferVBOs; BufferPointer _indexBuffer; Offset _indexBufferOffset; @@ -264,6 +280,8 @@ protected: typedef std::bitset ActivationCache; ActivationCache _attributeActivation; + GLuint _defaultVAO; + InputStageState() : _invalidFormat(true), _format(0), @@ -271,10 +289,12 @@ protected: _buffers(_buffersState.size(), BufferPointer(0)), _bufferOffsets(_buffersState.size(), 0), _bufferStrides(_buffersState.size(), 0), + _bufferVBOs(_buffersState.size(), 0), _indexBuffer(0), _indexBufferOffset(0), _indexBufferType(UINT32), - _attributeActivation(0) + _attributeActivation(0), + _defaultVAO(0) {} } _input; diff --git a/libraries/gpu/src/gpu/GLBackendInput.cpp b/libraries/gpu/src/gpu/GLBackendInput.cpp index aac7b56bc2..34b1b1761f 100755 --- a/libraries/gpu/src/gpu/GLBackendInput.cpp +++ b/libraries/gpu/src/gpu/GLBackendInput.cpp @@ -28,13 +28,39 @@ void GLBackend::do_setInputBuffer(Batch& batch, uint32 paramOffset) { uint32 channel = batch._params[paramOffset + 3]._uint; if (channel < getNumInputBuffers()) { - _input._buffers[channel] = buffer; - _input._bufferOffsets[channel] = offset; - _input._bufferStrides[channel] = stride; - _input._buffersState.set(channel); + bool isModified = false; + if (_input._buffers[channel] != buffer) { + _input._buffers[channel] = buffer; + + GLuint vbo = 0; + if (buffer) { + vbo = getBufferID((*buffer)); + } + _input._bufferVBOs[channel] = vbo; + + isModified = true; + } + + if (_input._bufferOffsets[channel] != offset) { + _input._bufferOffsets[channel] = offset; + isModified = true; + } + + if (_input._bufferStrides[channel] != stride) { + _input._bufferStrides[channel] = stride; + isModified = true; + } + + if (isModified) { + _input._buffersState.set(channel); + } } } +#define NOT_SUPPORT_VAO +#if defined(SUPPORT_VAO) +#else + #define SUPPORT_LEGACY_OPENGL #if defined(SUPPORT_LEGACY_OPENGL) static const int NUM_CLASSIC_ATTRIBS = Stream::TANGENT; @@ -45,24 +71,120 @@ static const GLenum attributeSlotToClassicAttribName[NUM_CLASSIC_ATTRIBS] = { GL_TEXTURE_COORD_ARRAY }; #endif +#endif + +void GLBackend::initInput() { +#if defined(SUPPORT_VAO) + if(!_input._defaultVAO) { + glGenVertexArrays(1, &_input._defaultVAO); + } + glBindVertexArray(_input._defaultVAO); + (void) CHECK_GL_ERROR(); +#endif +} + +void GLBackend::killInput() { +#if defined(SUPPORT_VAO) + glBindVertexArray(0); + if(_input._defaultVAO) { + glDeleteVertexArrays(1, &_input._defaultVAO); + } + (void) CHECK_GL_ERROR(); +#endif +} void GLBackend::syncInputStateCache() { +#if defined(SUPPORT_VAO) for (int i = 0; i < NUM_CLASSIC_ATTRIBS; i++) { _input._attributeActivation[i] = glIsEnabled(attributeSlotToClassicAttribName[i]); } + //_input._defaultVAO + glBindVertexArray(_input._defaultVAO); +#else + int i = 0; +#if defined(SUPPORT_LEGACY_OPENGL) + for (; i < NUM_CLASSIC_ATTRIBS; i++) { + _input._attributeActivation[i] = glIsEnabled(attributeSlotToClassicAttribName[i]); + } +#endif + for (; i < _input._attributeActivation.size(); i++) { + GLint active = 0; + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &active); + _input._attributeActivation[i] = active; + } +#endif } void GLBackend::updateInput() { +#if defined(SUPPORT_VAO) + if (_input._invalidFormat) { + + InputStageState::ActivationCache newActivation; + + // Assign the vertex format required + if (_input._format) { + for (auto& it : _input._format->getAttributes()) { + const Stream::Attribute& attrib = (it).second; + newActivation.set(attrib._slot); + glVertexAttribFormat( + attrib._slot, + attrib._element.getDimensionCount(), + _elementTypeToGLType[attrib._element.getType()], + attrib._element.isNormalized(), + attrib._offset); + } + (void) CHECK_GL_ERROR(); + } + + // Manage Activation what was and what is expected now + for (int i = 0; i < newActivation.size(); i++) { + bool newState = newActivation[i]; + if (newState != _input._attributeActivation[i]) { + if (newState) { + glEnableVertexAttribArray(i); + } else { + glDisableVertexAttribArray(i); + } + _input._attributeActivation.flip(i); + } + } + (void) CHECK_GL_ERROR(); + + _input._invalidFormat = false; + _stats._ISNumFormatChanges++; + } + + if (_input._buffersState.any()) { + int numBuffers = _input._buffers.size(); + auto buffer = _input._buffers.data(); + auto vbo = _input._bufferVBOs.data(); + auto offset = _input._bufferOffsets.data(); + auto stride = _input._bufferStrides.data(); + + for (int bufferNum = 0; bufferNum < numBuffers; bufferNum++) { + if (_input._buffersState.test(bufferNum)) { + glBindVertexBuffer(bufferNum, (*vbo), (*offset), (*stride)); + } + buffer++; + vbo++; + offset++; + stride++; + } + _input._buffersState.reset(); + (void) CHECK_GL_ERROR(); + } +#else if (_input._invalidFormat || _input._buffersState.any()) { if (_input._invalidFormat) { InputStageState::ActivationCache newActivation; + _stats._ISNumFormatChanges++; + // Check expected activation if (_input._format) { - const Stream::Format::AttributeMap& attributes = _input._format->getAttributes(); - for (Stream::Format::AttributeMap::const_iterator it = attributes.begin(); it != attributes.end(); it++) { - const Stream::Attribute& attrib = (*it).second; + for (auto& it : _input._format->getAttributes()) { + const Stream::Attribute& attrib = (it).second; newActivation.set(attrib._slot); } } @@ -72,17 +194,15 @@ void GLBackend::updateInput() { bool newState = newActivation[i]; if (newState != _input._attributeActivation[i]) { #if defined(SUPPORT_LEGACY_OPENGL) - const bool useClientState = i < NUM_CLASSIC_ATTRIBS; -#else - const bool useClientState = false; -#endif - if (useClientState) { + if (i < NUM_CLASSIC_ATTRIBS) { if (newState) { glEnableClientState(attributeSlotToClassicAttribName[i]); } else { glDisableClientState(attributeSlotToClassicAttribName[i]); } - } else { + } else +#endif + { if (newState) { glEnableVertexAttribArray(i); } else { @@ -103,18 +223,23 @@ void GLBackend::updateInput() { const Offsets& strides = _input._bufferStrides; const Stream::Format::AttributeMap& attributes = _input._format->getAttributes(); + auto& inputChannels = _input._format->getChannels(); + _stats._ISNumInputBufferChanges++; - for (Stream::Format::ChannelMap::const_iterator channelIt = _input._format->getChannels().begin(); - channelIt != _input._format->getChannels().end(); - channelIt++) { - const Stream::Format::ChannelMap::value_type::second_type& channel = (*channelIt).second; - if ((*channelIt).first < buffers.size()) { - int bufferNum = (*channelIt).first; + GLuint boundVBO = 0; + for (auto& channelIt : inputChannels) { + const Stream::Format::ChannelMap::value_type::second_type& channel = (channelIt).second; + if ((channelIt).first < buffers.size()) { + int bufferNum = (channelIt).first; if (_input._buffersState.test(bufferNum) || _input._invalidFormat) { - GLuint vbo = gpu::GLBackend::getBufferID((*buffers[bufferNum])); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - (void) CHECK_GL_ERROR(); + // GLuint vbo = gpu::GLBackend::getBufferID((*buffers[bufferNum])); + GLuint vbo = _input._bufferVBOs[bufferNum]; + if (boundVBO != vbo) { + glBindBuffer(GL_ARRAY_BUFFER, vbo); + (void) CHECK_GL_ERROR(); + boundVBO = vbo; + } _input._buffersState[bufferNum] = false; for (unsigned int i = 0; i < channel._slots.size(); i++) { @@ -126,9 +251,6 @@ void GLBackend::updateInput() { GLuint pointer = attrib._offset + offsets[bufferNum]; #if defined(SUPPORT_LEGACY_OPENGL) const bool useClientState = slot < NUM_CLASSIC_ATTRIBS; -#else - const bool useClientState = false; -#endif if (useClientState) { switch (slot) { case Stream::POSITION: @@ -144,7 +266,9 @@ void GLBackend::updateInput() { glTexCoordPointer(count, type, stride, reinterpret_cast(pointer)); break; }; - } else { + } else +#endif + { GLboolean isNormalized = attrib._element.isNormalized(); glVertexAttribPointer(slot, count, type, isNormalized, stride, reinterpret_cast(pointer)); @@ -158,61 +282,7 @@ void GLBackend::updateInput() { // everything format related should be in sync now _input._invalidFormat = false; } - -/* TODO: Fancy version GL4.4 - if (_needInputFormatUpdate) { - - InputActivationCache newActivation; - - // Assign the vertex format required - if (_inputFormat) { - const StreamFormat::AttributeMap& attributes = _inputFormat->getAttributes(); - for (StreamFormat::AttributeMap::const_iterator it = attributes.begin(); it != attributes.end(); it++) { - const StreamFormat::Attribute& attrib = (*it).second; - newActivation.set(attrib._slot); - glVertexAttribFormat( - attrib._slot, - attrib._element.getDimensionCount(), - _elementTypeToGLType[attrib._element.getType()], - attrib._element.isNormalized(), - attrib._stride); - } - CHECK_GL_ERROR(); - } - - // Manage Activation what was and what is expected now - for (int i = 0; i < newActivation.size(); i++) { - bool newState = newActivation[i]; - if (newState != _inputAttributeActivation[i]) { - if (newState) { - glEnableVertexAttribArray(i); - } else { - glDisableVertexAttribArray(i); - } - _inputAttributeActivation.flip(i); - } - } - CHECK_GL_ERROR(); - - _needInputFormatUpdate = false; - } - - if (_needInputStreamUpdate) { - if (_inputStream) { - const Stream::Buffers& buffers = _inputStream->getBuffers(); - const Stream::Offsets& offsets = _inputStream->getOffsets(); - const Stream::Strides& strides = _inputStream->getStrides(); - - for (int i = 0; i < buffers.size(); i++) { - GLuint vbo = gpu::GLBackend::getBufferID((*buffers[i])); - glBindVertexBuffer(i, vbo, offsets[i], strides[i]); - } - - CHECK_GL_ERROR(); - } - _needInputStreamUpdate = false; - } -*/ +#endif } diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 7902275c27..fd5bed2e5e 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -41,21 +41,34 @@ void makeBindings(GLBackend::GLShader* shader) { glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position"); } + loc = glGetAttribLocation(glprogram, "attribPosition"); + if (loc >= 0) { + glBindAttribLocation(glprogram, gpu::Stream::POSITION, "attribPosition"); + } + //Check for gpu specific attribute slotBindings loc = glGetAttribLocation(glprogram, "gl_Vertex"); if (loc >= 0) { - glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position"); + glBindAttribLocation(glprogram, gpu::Stream::POSITION, "gl_Vertex"); } loc = glGetAttribLocation(glprogram, "normal"); if (loc >= 0) { glBindAttribLocation(glprogram, gpu::Stream::NORMAL, "normal"); } + loc = glGetAttribLocation(glprogram, "attribNormal"); + if (loc >= 0) { + glBindAttribLocation(glprogram, gpu::Stream::NORMAL, "attribNormal"); + } loc = glGetAttribLocation(glprogram, "color"); if (loc >= 0) { glBindAttribLocation(glprogram, gpu::Stream::COLOR, "color"); } + loc = glGetAttribLocation(glprogram, "attribColor"); + if (loc >= 0) { + glBindAttribLocation(glprogram, gpu::Stream::COLOR, "attribColor"); + } loc = glGetAttribLocation(glprogram, "texcoord"); if (loc >= 0) { @@ -75,6 +88,10 @@ void makeBindings(GLBackend::GLShader* shader) { if (loc >= 0) { glBindAttribLocation(glprogram, gpu::Stream::TEXCOORD1, "texcoord1"); } + loc = glGetAttribLocation(glprogram, "attribTexcoord1"); + if (loc >= 0) { + glBindAttribLocation(glprogram, gpu::Stream::TEXCOORD1, "texcoord1"); + } loc = glGetAttribLocation(glprogram, "clusterIndices"); if (loc >= 0) { diff --git a/libraries/gpu/src/gpu/GLBackendTransform.cpp b/libraries/gpu/src/gpu/GLBackendTransform.cpp index 48a42fe5f1..01229cb317 100755 --- a/libraries/gpu/src/gpu/GLBackendTransform.cpp +++ b/libraries/gpu/src/gpu/GLBackendTransform.cpp @@ -82,8 +82,6 @@ void GLBackend::syncTransformStateCache() { } void GLBackend::updateTransform() { - GLint originalMatrixMode; - glGetIntegerv(GL_MATRIX_MODE, &originalMatrixMode); // Check all the dirty flags and update the state accordingly if (_transform._invalidViewport) { _transform._transformCamera._viewport = glm::vec4(_transform._viewport); @@ -138,6 +136,9 @@ void GLBackend::updateTransform() { #if (GPU_TRANSFORM_PROFILE == GPU_LEGACY) // Do it again for fixed pipeline until we can get rid of it + GLint originalMatrixMode; + glGetIntegerv(GL_MATRIX_MODE, &originalMatrixMode); + if (_transform._invalidProj) { if (_transform._lastMode != GL_PROJECTION) { glMatrixMode(GL_PROJECTION); @@ -173,12 +174,12 @@ void GLBackend::updateTransform() { } (void) CHECK_GL_ERROR(); } + + glMatrixMode(originalMatrixMode); #endif // Flags are clean _transform._invalidView = _transform._invalidProj = _transform._invalidModel = _transform._invalidViewport = false; - - glMatrixMode(originalMatrixMode); } From 8bb6616a2587ddd815063965f683ce5ed8580ea3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 18:47:35 -0700 Subject: [PATCH 32/44] remove nakedGL from skeleton IK constraint rendering --- interface/src/avatar/MyAvatar.cpp | 5 +++-- interface/src/avatar/SkeletonModel.cpp | 27 +++++++++++++------------- interface/src/avatar/SkeletonModel.h | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e532890b25..053ce7b3cc 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -333,8 +333,9 @@ void MyAvatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, b Avatar::render(renderArgs, cameraPosition, postLighting); // don't display IK constraints in shadow mode - if (Menu::getInstance()->isOptionChecked(MenuOption::ShowIKConstraints) && postLighting) { - _skeletonModel.renderIKConstraints(); + if (Menu::getInstance()->isOptionChecked(MenuOption::ShowIKConstraints) && + renderArgs && renderArgs->_batch) { + _skeletonModel.renderIKConstraints(*renderArgs->_batch); } } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 20d458195d..b20d2d354f 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -186,9 +186,9 @@ void SkeletonModel::getHandShapes(int jointIndex, QVector& shapes) } } -void SkeletonModel::renderIKConstraints() { - renderJointConstraints(getRightHandJointIndex()); - renderJointConstraints(getLeftHandJointIndex()); +void SkeletonModel::renderIKConstraints(gpu::Batch& batch) { + renderJointConstraints(batch, getRightHandJointIndex()); + renderJointConstraints(batch, getLeftHandJointIndex()); } class IndexValue { @@ -312,26 +312,27 @@ void SkeletonModel::maybeUpdateEyeRotation(const JointState& parentState, const _owningAvatar->getHead()->getFaceModel().maybeUpdateEyeRotation(this, parentState, joint, state); } -void SkeletonModel::renderJointConstraints(int jointIndex) { +void SkeletonModel::renderJointConstraints(gpu::Batch& batch, int jointIndex) { if (jointIndex == -1 || jointIndex >= _jointStates.size()) { return; } const FBXGeometry& geometry = _geometry->getFBXGeometry(); const float BASE_DIRECTION_SIZE = 0.3f; float directionSize = BASE_DIRECTION_SIZE * extractUniformScale(_scale); - glLineWidth(3.0f); + batch._glLineWidth(3.0f); do { const FBXJoint& joint = geometry.joints.at(jointIndex); const JointState& jointState = _jointStates.at(jointIndex); glm::vec3 position = _rotation * jointState.getPosition() + _translation; - - glPushMatrix(); - glTranslatef(position.x, position.y, position.z); glm::quat parentRotation = (joint.parentIndex == -1) ? _rotation : _rotation * _jointStates.at(joint.parentIndex).getRotation(); - glm::vec3 rotationAxis = glm::axis(parentRotation); - glRotatef(glm::degrees(glm::angle(parentRotation)), rotationAxis.x, rotationAxis.y, rotationAxis.z); float fanScale = directionSize * 0.75f; - glScalef(fanScale, fanScale, fanScale); + + Transform transform = Transform(); + transform.setTranslation(position); + transform.setRotation(parentRotation); + transform.setScale(fanScale); + batch.setModelTransform(transform); + const int AXIS_COUNT = 3; auto geometryCache = DependencyManager::get(); @@ -362,7 +363,7 @@ void SkeletonModel::renderJointConstraints(int jointIndex) { // TODO: this is really inefficient constantly recreating these vertices buffers. It would be // better if the skeleton model cached these buffers for each of the joints they are rendering geometryCache->updateVertices(_triangleFanID, points, color); - geometryCache->renderVertices(gpu::TRIANGLE_FAN, _triangleFanID); + geometryCache->renderVertices(batch, gpu::TRIANGLE_FAN, _triangleFanID); } glPopMatrix(); @@ -371,8 +372,6 @@ void SkeletonModel::renderJointConstraints(int jointIndex) { jointIndex = joint.parentIndex; } while (jointIndex != -1 && geometry.joints.at(jointIndex).isFree); - - glLineWidth(1.0f); } void SkeletonModel::renderOrientationDirections(int jointIndex, glm::vec3 position, const glm::quat& orientation, float size) { diff --git a/interface/src/avatar/SkeletonModel.h b/interface/src/avatar/SkeletonModel.h index 755aa3dfee..3d63238cf2 100644 --- a/interface/src/avatar/SkeletonModel.h +++ b/interface/src/avatar/SkeletonModel.h @@ -36,7 +36,7 @@ public: /// \param shapes[out] list in which is stored pointers to hand shapes void getHandShapes(int jointIndex, QVector& shapes) const; - void renderIKConstraints(); + void renderIKConstraints(gpu::Batch& batch); /// Returns the index of the left hand joint, or -1 if not found. int getLeftHandJointIndex() const { return isActive() ? _geometry->getFBXGeometry().leftHandJointIndex : -1; } @@ -144,7 +144,7 @@ protected: private: - void renderJointConstraints(int jointIndex); + void renderJointConstraints(gpu::Batch& batch, int jointIndex); void renderOrientationDirections(int jointIndex, glm::vec3 position, const glm::quat& orientation, float size); struct OrientationLineIDs { From 5d43c98ebc1c1c19a96b7d8d0550dfc95756caf0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 20:56:36 -0700 Subject: [PATCH 33/44] fix image overlays to not use Naked GL --- interface/src/ui/overlays/ImageOverlay.cpp | 55 ++++------------------ 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 360eb3261d..ce6e12d73e 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -62,42 +62,18 @@ void ImageOverlay::render(RenderArgs* args) { return; } - // TODO: I commented all the code needed to migrate this ImageOverlay rendering from naked gl to gpu::Batch - /*gpu::Batch localBatch; - gpu::Batch& batch = (args->_batch ? (*args->_batch) : localBatch); - static gpu::PipelinePointer drawPipeline; - static int texcoordRectLoc = -1; - static int colorLoc = -1; - if (!drawPipeline) { - auto blitProgram = gpu::StandardShaderLib::getProgram(gpu::StandardShaderLib::getDrawTexcoordRectTransformUnitQuadVS, gpu::StandardShaderLib::getDrawColoredTexturePS); - gpu::Shader::makeProgram(*blitProgram); - texcoordRectLoc = blitProgram->getUniforms().findLocation("texcoordRect"); - colorLoc = blitProgram->getUniforms().findLocation("color"); - - gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); - blitState->setBlendFunction(false, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); - blitState->setColorWriteMask(true, true, true, true); - drawPipeline = gpu::PipelinePointer(gpu::Pipeline::create(blitProgram, blitState)); - } - */ - // TODO: batch.setPipeline(drawPipeline); - glUseProgram(0); + gpu::Batch& batch = *args->_batch; if (_renderImage) { - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, _texture->getID()); - // TODO: batch.setResourceTexture(0, _texture->getGPUTexture()); - } // TODO: else { - // TODO: batch.setResourceTexture(0, args->_whiteTexture); - // TODO: } - - // TODO: batch.setViewTransform(Transform()); + batch.setResourceTexture(0, _texture->getGPUTexture()); + } else { + batch.setResourceTexture(0, args->_whiteTexture); + } const float MAX_COLOR = 255.0f; xColor color = getColor(); float alpha = getAlpha(); glm::vec4 quadColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); - // TODO: batch._glUniform4fv(colorLoc, 1, (const float*) &quadColor); int left = _bounds.left(); int right = _bounds.right() + 1; @@ -107,11 +83,7 @@ void ImageOverlay::render(RenderArgs* args) { glm::vec2 topLeft(left, top); glm::vec2 bottomRight(right, bottom); - // TODO: Transform model; - // TODO: model.setTranslation(glm::vec3(0.5f * (right + left), 0.5f * (top + bottom), 0.0f)); - // TODO: model.setScale(glm::vec3(0.5f * (right - left), 0.5f * (bottom - top), 1.0f)); - // TODO: batch.setModelTransform(model); - + batch.setModelTransform(Transform()); // if for some reason our image is not over 0 width or height, don't attempt to render the image if (_renderImage) { @@ -144,22 +116,13 @@ void ImageOverlay::render(RenderArgs* args) { glm::vec2 texCoordBottomRight(x + w, y + h); glm::vec4 texcoordRect(texCoordTopLeft, w, h); - // TODO: batch._glUniform4fv(texcoordRectLoc, 1, (const float*) &texcoordRect); - // TODO: batch.draw(gpu::TRIANGLE_STRIP, 4); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); } else { - // TODO: batch.draw(gpu::TRIANGLE_STRIP, 4); - DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, quadColor); } - glDisable(GL_TEXTURE_2D); } else { - // TODO: batch.draw(gpu::TRIANGLE_STRIP, 4); - DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, quadColor); } - - // TODO: if (!args->_batch) { - // TODO: args->_context->render(batch); - // TODO: } } void ImageOverlay::setProperties(const QScriptValue& properties) { From e39ea72daf96604ff215547d5818f1f16e2cd3cc Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 14 Jul 2015 21:25:49 -0700 Subject: [PATCH 34/44] removed dead code --- interface/src/Application.cpp | 2 - interface/src/Menu.cpp | 10 +- interface/src/Util.cpp | 17 -- interface/src/Util.h | 3 - interface/src/audio/AudioIOStatsRenderer.cpp | 242 ------------------- interface/src/audio/AudioIOStatsRenderer.h | 45 ---- interface/src/ui/ApplicationOverlay.cpp | 1 - 7 files changed, 2 insertions(+), 318 deletions(-) delete mode 100644 interface/src/audio/AudioIOStatsRenderer.cpp delete mode 100644 interface/src/audio/AudioIOStatsRenderer.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 65615a65b0..dec179d479 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -112,7 +112,6 @@ #include "avatar/AvatarManager.h" -#include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" #include "devices/DdeFaceTracker.h" @@ -274,7 +273,6 @@ bool setupEssentials(int& argc, char** argv) { auto faceshift = DependencyManager::set(); auto audio = DependencyManager::set(); auto audioScope = DependencyManager::set(); - auto audioIOStatsRenderer = DependencyManager::set(); auto deferredLightingEffect = DependencyManager::set(); auto ambientOcclusionEffect = DependencyManager::set(); auto textureCache = DependencyManager::set(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 60311904de..f292ff2d2a 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -24,7 +24,6 @@ #include "Application.h" #include "AccountManager.h" -#include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" #include "devices/DdeFaceTracker.h" @@ -588,18 +587,13 @@ Menu::Menu() { audioScopeFramesGroup->addAction(fiftyFrames); } - auto statsRenderer = DependencyManager::get(); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioStats, Qt::CTRL | Qt::SHIFT | Qt::Key_A, - false, - statsRenderer.data(), - SLOT(toggle())); + false); //, statsRenderer.data(), SLOT(toggle())); // TODO: convert to dialogbox addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioStatsShowInjectedStreams, 0, - false, - statsRenderer.data(), - SLOT(toggleShowInjectedStreams())); + false); //, statsRenderer.data(), SLOT(toggleShowInjectedStreams)); // TODO: convert to dialogbox MenuWrapper* physicsOptionsMenu = developerMenu->addMenu("Physics"); diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 82f7d55b5d..9a013c8f6f 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -100,23 +100,6 @@ int widthText(float scale, int mono, char const* string) { return textRenderer(mono)->computeExtent(string).x; // computeWidth(string) * (scale / 0.10); } -void drawText(int x, int y, float scale, float radians, int mono, - char const* string, const float* color) { - // - // Draws text on screen as stroked so it can be resized - // - glPushMatrix(); - glTranslatef(static_cast(x), static_cast(y), 0.0f); - - - glRotated(double(radians * DEGREES_PER_RADIAN), 0.0, 0.0, 1.0); - glScalef(scale / 0.1f, scale / 0.1f, 1.0f); - - glm::vec4 colorV4 = {color[0], color[1], color[2], 1.0f }; - textRenderer(mono)->draw(0, 0, string, colorV4); - glPopMatrix(); -} - void renderCollisionOverlay(int width, int height, float magnitude, float red, float blue, float green) { const float MIN_VISIBLE_COLLISION = 0.01f; if (magnitude > MIN_VISIBLE_COLLISION) { diff --git a/interface/src/Util.h b/interface/src/Util.h index d252c26bef..a422918d9a 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -24,9 +24,6 @@ const glm::vec3 randVector(); void renderWorldBox(gpu::Batch& batch); int widthText(float scale, int mono, char const* string); -void drawText(int x, int y, float scale, float radians, int mono, - char const* string, const float* color); - void renderCollisionOverlay(int width, int height, float magnitude, float red = 0, float blue = 0, float green = 0); void runTimingTests(); diff --git a/interface/src/audio/AudioIOStatsRenderer.cpp b/interface/src/audio/AudioIOStatsRenderer.cpp deleted file mode 100644 index 35b716c611..0000000000 --- a/interface/src/audio/AudioIOStatsRenderer.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// -// AudioIOStatsRenderer.cpp -// interface/src/audio -// -// Created by Stephen Birarda on 2014-12-16. -// Copyright 2014 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 "InterfaceConfig.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "AudioIOStatsRenderer.h" - -AudioIOStatsRenderer::AudioIOStatsRenderer() : - _stats(NULL), - _isEnabled(false), - _shouldShowInjectedStreams(false) -{ - // grab the stats object from the audio I/O singleton - _stats = &DependencyManager::get()->getStats(); -} - -#ifdef _WIN32 -const unsigned int STATS_WIDTH = 1500; -#else -const unsigned int STATS_WIDTH = 650; -#endif -const unsigned int STATS_HEIGHT_PER_LINE = 20; - -void AudioIOStatsRenderer::render(const float* color, int width, int height) { - if (!_isEnabled) { - return; - } - - const int linesWhenCentered = _shouldShowInjectedStreams ? 34 : 27; - const int CENTERED_BACKGROUND_HEIGHT = STATS_HEIGHT_PER_LINE * linesWhenCentered; - - int lines = _shouldShowInjectedStreams ? _stats->getMixerInjectedStreamStatsMap().size() * 7 + 27 : 27; - int statsHeight = STATS_HEIGHT_PER_LINE * lines; - - - static const glm::vec4 backgroundColor = { 0.2f, 0.2f, 0.2f, 0.6f }; - int x = std::max((width - (int)STATS_WIDTH) / 2, 0); - int y = std::max((height - CENTERED_BACKGROUND_HEIGHT) / 2, 0); - int w = STATS_WIDTH; - int h = statsHeight; - DependencyManager::get()->renderQuad(x, y, w, h, backgroundColor); - - int horizontalOffset = x + 5; - int verticalOffset = y; - - float scale = 0.10f; - float rotation = 0.0f; - int font = 2; - - char latencyStatString[512]; - - float audioInputBufferLatency = 0.0f, inputRingBufferLatency = 0.0f, networkRoundtripLatency = 0.0f, mixerRingBufferLatency = 0.0f, outputRingBufferLatency = 0.0f, audioOutputBufferLatency = 0.0f; - - AudioStreamStats downstreamAudioStreamStats = _stats->getMixerDownstreamStats(); - SharedNodePointer audioMixerNodePointer = DependencyManager::get()->soloNodeOfType(NodeType::AudioMixer); - if (!audioMixerNodePointer.isNull()) { - audioInputBufferLatency = _stats->getAudioInputMsecsReadStats().getWindowAverage(); - inputRingBufferLatency = (float) _stats->getInputRungBufferMsecsAvailableStats().getWindowAverage(); - networkRoundtripLatency = audioMixerNodePointer->getPingMs(); - mixerRingBufferLatency = _stats->getMixerAvatarStreamStats()._framesAvailableAverage * AudioConstants::NETWORK_FRAME_MSECS; - outputRingBufferLatency = downstreamAudioStreamStats._framesAvailableAverage * AudioConstants::NETWORK_FRAME_MSECS; - audioOutputBufferLatency = _stats->getAudioOutputMsecsUnplayedStats().getWindowAverage(); - } - float totalLatency = audioInputBufferLatency + inputRingBufferLatency + networkRoundtripLatency + mixerRingBufferLatency + outputRingBufferLatency + audioOutputBufferLatency; - - sprintf(latencyStatString, - " Audio input buffer: %7.2fms - avg msecs of samples read to the input ring buffer in last 10s", - (double)audioInputBufferLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " Input ring buffer: %7.2fms - avg msecs of samples in input ring buffer in last 10s", - (double)inputRingBufferLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " Network to mixer: %7.2fms - half of last ping value calculated by the node list", - (double)(networkRoundtripLatency / 2.0f)); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " AudioMixer ring buffer: %7.2fms - avg msecs of samples in audio mixer's ring buffer in last 10s", - (double)mixerRingBufferLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " Network to client: %7.2fms - half of last ping value calculated by the node list", - (double)(networkRoundtripLatency / 2.0f)); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " Output ring buffer: %7.2fms - avg msecs of samples in output ring buffer in last 10s", - (double)outputRingBufferLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, - " Audio output buffer: %7.2fms - avg msecs of samples in audio output buffer in last 10s", - (double)audioOutputBufferLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - sprintf(latencyStatString, " TOTAL: %7.2fms\n", (double)totalLatency); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, latencyStatString, color); - - - verticalOffset += STATS_HEIGHT_PER_LINE; // blank line - - char clientUpstreamMicLabelString[] = "Upstream Mic Audio Packets Sent Gaps (by client):"; - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, clientUpstreamMicLabelString, color); - - const MovingMinMaxAvg& packetSentTimeGaps = _stats->getPacketSentTimeGaps(); - - char stringBuffer[512]; - sprintf(stringBuffer, " Inter-packet timegaps (overall) | min: %9s, max: %9s, avg: %9s", - formatUsecTime(packetSentTimeGaps.getMin()).toLatin1().data(), - formatUsecTime(packetSentTimeGaps.getMax()).toLatin1().data(), - formatUsecTime(packetSentTimeGaps.getAverage()).toLatin1().data()); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - sprintf(stringBuffer, " Inter-packet timegaps (last 30s) | min: %9s, max: %9s, avg: %9s", - formatUsecTime(packetSentTimeGaps.getWindowMin()).toLatin1().data(), - formatUsecTime(packetSentTimeGaps.getWindowMax()).toLatin1().data(), - formatUsecTime(packetSentTimeGaps.getWindowAverage()).toLatin1().data()); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - verticalOffset += STATS_HEIGHT_PER_LINE; // blank line - - char upstreamMicLabelString[] = "Upstream mic audio stats (received and reported by audio-mixer):"; - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, upstreamMicLabelString, color); - - renderAudioStreamStats(&_stats->getMixerAvatarStreamStats(), horizontalOffset, verticalOffset, - scale, rotation, font, color); - - - verticalOffset += STATS_HEIGHT_PER_LINE; // blank line - - char downstreamLabelString[] = "Downstream mixed audio stats:"; - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, downstreamLabelString, color); - - AudioStreamStats downstreamStats = _stats->getMixerDownstreamStats(); - renderAudioStreamStats(&downstreamStats, horizontalOffset, verticalOffset, - scale, rotation, font, color, true); - - - if (_shouldShowInjectedStreams) { - - foreach(const AudioStreamStats& injectedStreamAudioStats, _stats->getMixerInjectedStreamStatsMap()) { - - verticalOffset += STATS_HEIGHT_PER_LINE; // blank line - - char upstreamInjectedLabelString[512]; - sprintf(upstreamInjectedLabelString, "Upstream injected audio stats: stream ID: %s", - injectedStreamAudioStats._streamIdentifier.toString().toLatin1().data()); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, upstreamInjectedLabelString, color); - - renderAudioStreamStats(&injectedStreamAudioStats, horizontalOffset, verticalOffset, scale, rotation, font, color); - } - } -} - -void AudioIOStatsRenderer::renderAudioStreamStats(const AudioStreamStats* streamStats, int horizontalOffset, int& verticalOffset, - float scale, float rotation, int font, const float* color, bool isDownstreamStats) { - - char stringBuffer[512]; - - sprintf(stringBuffer, " Packet loss | overall: %5.2f%% (%d lost), last_30s: %5.2f%% (%d lost)", - (double)(streamStats->_packetStreamStats.getLostRate() * 100.0f), - streamStats->_packetStreamStats._lost, - (double)(streamStats->_packetStreamWindowStats.getLostRate() * 100.0f), - streamStats->_packetStreamWindowStats._lost); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - if (isDownstreamStats) { - sprintf(stringBuffer, " Ringbuffer frames | desired: %u, avg_available(10s): %u+%d, available: %u+%d", - streamStats->_desiredJitterBufferFrames, - streamStats->_framesAvailableAverage, - (int)((float)_stats->getAudioInputMsecsReadStats().getWindowAverage() / AudioConstants::NETWORK_FRAME_MSECS), - streamStats->_framesAvailable, - (int)(_stats->getAudioOutputMsecsUnplayedStats().getCurrentIntervalLastSample() - / AudioConstants::NETWORK_FRAME_MSECS)); - } else { - sprintf(stringBuffer, " Ringbuffer frames | desired: %u, avg_available(10s): %u, available: %u", - streamStats->_desiredJitterBufferFrames, - streamStats->_framesAvailableAverage, - streamStats->_framesAvailable); - } - - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - sprintf(stringBuffer, " Ringbuffer stats | starves: %u, prev_starve_lasted: %u, frames_dropped: %u, overflows: %u", - streamStats->_starveCount, - streamStats->_consecutiveNotMixedCount, - streamStats->_framesDropped, - streamStats->_overflowCount); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - sprintf(stringBuffer, " Inter-packet timegaps (overall) | min: %9s, max: %9s, avg: %9s", - formatUsecTime(streamStats->_timeGapMin).toLatin1().data(), - formatUsecTime(streamStats->_timeGapMax).toLatin1().data(), - formatUsecTime(streamStats->_timeGapAverage).toLatin1().data()); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); - - sprintf(stringBuffer, " Inter-packet timegaps (last 30s) | min: %9s, max: %9s, avg: %9s", - formatUsecTime(streamStats->_timeGapWindowMin).toLatin1().data(), - formatUsecTime(streamStats->_timeGapWindowMax).toLatin1().data(), - formatUsecTime(streamStats->_timeGapWindowAverage).toLatin1().data()); - verticalOffset += STATS_HEIGHT_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, stringBuffer, color); -} diff --git a/interface/src/audio/AudioIOStatsRenderer.h b/interface/src/audio/AudioIOStatsRenderer.h deleted file mode 100644 index 79d177e252..0000000000 --- a/interface/src/audio/AudioIOStatsRenderer.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// AudioIOStatsRenderer.h -// interface/src/audio -// -// Created by Stephen Birarda on 2014-12-16. -// Copyright 2014 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_AudioIOStatsRenderer_h -#define hifi_AudioIOStatsRenderer_h - -#include - -#include - -class AudioIOStats; -class AudioStreamStats; - -class AudioIOStatsRenderer : public QObject, public Dependency { - Q_OBJECT - SINGLETON_DEPENDENCY -public: - void render(const float* color, int width, int height); - -public slots: - void toggle() { _isEnabled = !_isEnabled; } - void toggleShowInjectedStreams() { _shouldShowInjectedStreams = !_shouldShowInjectedStreams; } -protected: - AudioIOStatsRenderer(); -private: - // audio stats methods for rendering - void renderAudioStreamStats(const AudioStreamStats* streamStats, int horizontalOffset, int& verticalOffset, - float scale, float rotation, int font, const float* color, bool isDownstreamStats = false); - - const AudioIOStats* _stats; - - bool _isEnabled; - bool _shouldShowInjectedStreams; -}; - - -#endif // hifi_AudioIOStatsRenderer_h \ No newline at end of file diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index b28c5c83a2..63dcba9d5d 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -27,7 +27,6 @@ #include #include "AudioClient.h" -#include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" #include "Application.h" #include "ApplicationOverlay.h" From c9112966bae7614e4f581e3093a017da7f4b607c Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 14 Jul 2015 22:00:32 -0700 Subject: [PATCH 35/44] revert debug code --- interface/src/ui/ApplicationOverlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 5d26f5062f..b28c5c83a2 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -109,7 +109,7 @@ void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { batch._glBindTexture(GL_TEXTURE_2D, _uiTexture); geometryCache->renderUnitQuad(batch, glm::vec4(1)); renderArgs->_context->syncCache(); - // renderArgs->_context->render(batch); + renderArgs->_context->render(batch); } } From a6148ab73d4b3c9032846a54e8642ce0252913d6 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 14 Jul 2015 22:59:55 -0700 Subject: [PATCH 36/44] Remove naked gl call --- libraries/render-utils/src/RenderDeferredTask.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index dc0de80e42..fab134913d 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -187,9 +187,6 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; - - // reset blend function to standard... - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } gpu::PipelinePointer DrawOverlay3D::_opaquePipeline; From 9df26c84889f65b2594f67c4c7f9e93bf6aacecb Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 15 Jul 2015 00:24:43 -0700 Subject: [PATCH 37/44] removing naked glViewport from DeferredLightingEffect by adding the current viewport in renderArgs --- interface/src/Application.cpp | 7 +++- interface/src/devices/OculusManager.cpp | 1 + interface/src/devices/TV3DManager.cpp | 2 + interface/src/ui/ApplicationCompositor.cpp | 1 + .../src/DeferredLightingEffect.cpp | 38 ++++++------------- libraries/shared/src/RenderArgs.h | 1 + 6 files changed, 23 insertions(+), 27 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 65615a65b0..721976861a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -981,7 +981,8 @@ void Application::paintGL() { // Viewport is assigned to the size of the framebuffer QSize size = DependencyManager::get()->getFrameBufferSize(); glViewport(0, 0, size.width(), size.height()); - + renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -3718,6 +3719,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi QSize size = DependencyManager::get()->getFrameBufferSize(); glViewport(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); glScissor(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); + renderArgs->_viewport = glm::ivec4(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); } else { // if not rendering the billboard, the region is in device independent coordinates; must convert to device QSize size = DependencyManager::get()->getFrameBufferSize(); @@ -3725,6 +3727,8 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio; glViewport(x, size.height() - y - height, width, height); glScissor(x, size.height() - y - height, width, height); + + renderArgs->_viewport = glm::ivec4(x, size.height() - y - height, width, height); } bool updateViewFrustum = false; updateProjectionMatrix(_mirrorCamera, updateViewFrustum); @@ -3737,6 +3741,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi glPopMatrix(); // reset Viewport and projection matrix + renderArgs->_viewport = glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3]); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); glDisable(GL_SCISSOR_TEST); updateProjectionMatrix(_myCamera, updateViewFrustum); diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 7bab6f58b9..e3bf19de30 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -714,6 +714,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const vp.Size.w = _recommendedTexSize.w * _offscreenRenderScale; glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); + renderArgs->_viewport = glm::ivec4(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, *_camera); qApp->getApplicationCompositor().displayOverlayTextureHmd(renderArgs, eye); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index e945b5e79a..20ab39ebfc 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -107,6 +107,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { _activeEye = &eye; glViewport(portalX, portalY, portalW, portalH); glScissor(portalX, portalY, portalW, portalH); + renderArgs->_viewport = glm::ivec4(portalX, portalY, portalW, portalH); glm::mat4 projection = glm::frustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); projection = glm::translate(projection, vec3(eye.modelTranslation, 0, 0)); @@ -118,6 +119,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); renderArgs->_renderSide = RenderArgs::MONO; + qApp->displaySide(renderArgs, eyeCamera, false); qApp->getApplicationCompositor().displayOverlayTexture(renderArgs); _activeEye = NULL; diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index fb7fffb19c..9540fca87e 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -206,6 +206,7 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); + batch.setViewportTransform(glm::ivec4(0, 0, deviceSize.width(), deviceSize.height())); batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); batch.setProjectionTransform(mat4()); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index b2db089bbe..6fac490cab 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -240,6 +240,8 @@ void DeferredLightingEffect::render(RenderArgs* args) { // binding the first framebuffer auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); batch.setFramebuffer(freeFBO); + + batch.setViewportTransform(args->_viewport); batch.clearColorFramebuffer(freeFBO->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); @@ -251,18 +253,10 @@ void DeferredLightingEffect::render(RenderArgs* args) { batch.setResourceTexture(3, textureCache->getPrimaryDepthTexture()); - // get the viewport side (left, right, both) - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_Y_INDEX = 1; - const int VIEWPORT_WIDTH_INDEX = 2; - const int VIEWPORT_HEIGHT_INDEX = 3; - - float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - float tMin = viewport[VIEWPORT_Y_INDEX] / (float)framebufferSize.height(); - float tHeight = viewport[VIEWPORT_HEIGHT_INDEX] / (float)framebufferSize.height(); + float sMin = args->_viewport.x / (float)framebufferSize.width(); + float sWidth = args->_viewport.z / (float)framebufferSize.width(); + float tMin = args->_viewport.y / (float)framebufferSize.height(); + float tHeight = args->_viewport.w / (float)framebufferSize.height(); bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); @@ -556,27 +550,19 @@ void DeferredLightingEffect::copyBack(RenderArgs* args) { batch.setProjectionTransform(glm::mat4()); batch.setViewTransform(Transform()); + + float sMin = args->_viewport.x / (float)framebufferSize.width(); + float sWidth = args->_viewport.z / (float)framebufferSize.width(); + float tMin = args->_viewport.y / (float)framebufferSize.height(); + float tHeight = args->_viewport.w / (float)framebufferSize.height(); - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_Y_INDEX = 1; - const int VIEWPORT_WIDTH_INDEX = 2; - const int VIEWPORT_HEIGHT_INDEX = 3; - - float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - float tMin = viewport[VIEWPORT_Y_INDEX] / (float)framebufferSize.height(); - float tHeight = viewport[VIEWPORT_HEIGHT_INDEX] / (float)framebufferSize.height(); + batch.setViewportTransform(args->_viewport); Transform model; model.setTranslation(glm::vec3(sMin, tMin, 0.0)); model.setScale(glm::vec3(sWidth, tHeight, 1.0)); batch.setModelTransform(model); - - batch.setViewportTransform(glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3])); - batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 9673623b13..5507072b2c 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -104,6 +104,7 @@ public: gpu::Context* _context = nullptr; OctreeRenderer* _renderer = nullptr; ViewFrustum* _viewFrustum = nullptr; + glm::ivec4 _viewport{ 0, 0, 1, 1 }; float _sizeScale = 1.0f; int _boundaryLevelAdjust = 0; RenderMode _renderMode = DEFAULT_RENDER_MODE; From 53c3e3d7310265111b6e6533a291c0f64509fe92 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 09:03:07 -0700 Subject: [PATCH 38/44] fix CR feedback --- interface/src/avatar/SkeletonModel.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index b20d2d354f..2d4baaf237 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -366,7 +366,6 @@ void SkeletonModel::renderJointConstraints(gpu::Batch& batch, int jointIndex) { geometryCache->renderVertices(batch, gpu::TRIANGLE_FAN, _triangleFanID); } - glPopMatrix(); renderOrientationDirections(jointIndex, position, _rotation * jointState.getRotation(), directionSize); jointIndex = joint.parentIndex; From 0eeddddd6b20afb46b6e3a20b6e861d29fbaf096 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 09:46:58 -0700 Subject: [PATCH 39/44] removed naked GL from drawOnHUD overlays. --- interface/src/ui/overlays/Overlays.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 57de4915ee..e4401b32ef 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -103,17 +103,7 @@ void Overlays::renderHUD(RenderArgs* renderArgs) { foreach(Overlay::Pointer thisOverlay, _overlaysHUD) { - if (thisOverlay->is3D()) { - glEnable(GL_DEPTH_TEST); - glEnable(GL_LIGHTING); - - thisOverlay->render(renderArgs); - - glDisable(GL_LIGHTING); - glDisable(GL_DEPTH_TEST); - } else { - thisOverlay->render(renderArgs); - } + thisOverlay->render(renderArgs); } renderArgs->_context->syncCache(); From 6b06987700b0ea1e814591a3591142dff2b8ba8f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 10:48:07 -0700 Subject: [PATCH 40/44] remove dead code for magnifier --- interface/src/ui/ApplicationCompositor.cpp | 69 ---------------------- interface/src/ui/ApplicationCompositor.h | 1 - 2 files changed, 70 deletions(-) diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index fb7fffb19c..5af82eef99 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -535,75 +535,6 @@ void ApplicationCompositor::renderControllerPointers(gpu::Batch& batch) { } } -//Renders a small magnification of the currently bound texture at the coordinates -void ApplicationCompositor::renderMagnifier(gpu::Batch& batch, const glm::vec2& magPos, float sizeMult, bool showBorder) { - if (!_magnifier) { - return; - } - auto canvasSize = qApp->getCanvasSize(); - - const int widgetWidth = canvasSize.x; - const int widgetHeight = canvasSize.y; - - const float halfWidth = (MAGNIFY_WIDTH / _textureAspectRatio) * sizeMult / 2.0f; - const float halfHeight = MAGNIFY_HEIGHT * sizeMult / 2.0f; - // Magnification Texture Coordinates - const float magnifyULeft = (magPos.x - halfWidth) / (float)widgetWidth; - const float magnifyURight = (magPos.x + halfWidth) / (float)widgetWidth; - const float magnifyVTop = 1.0f - (magPos.y - halfHeight) / (float)widgetHeight; - const float magnifyVBottom = 1.0f - (magPos.y + halfHeight) / (float)widgetHeight; - - const float newHalfWidth = halfWidth * MAGNIFY_MULT; - const float newHalfHeight = halfHeight * MAGNIFY_MULT; - //Get yaw / pitch value for the corners - const glm::vec2 topLeftYawPitch = overlayToSpherical(glm::vec2(magPos.x - newHalfWidth, - magPos.y - newHalfHeight)); - const glm::vec2 bottomRightYawPitch = overlayToSpherical(glm::vec2(magPos.x + newHalfWidth, - magPos.y + newHalfHeight)); - - const glm::vec3 bottomLeft = getPoint(topLeftYawPitch.x, bottomRightYawPitch.y); - const glm::vec3 bottomRight = getPoint(bottomRightYawPitch.x, bottomRightYawPitch.y); - const glm::vec3 topLeft = getPoint(topLeftYawPitch.x, topLeftYawPitch.y); - const glm::vec3 topRight = getPoint(bottomRightYawPitch.x, topLeftYawPitch.y); - - auto geometryCache = DependencyManager::get(); - - if (bottomLeft != _previousMagnifierBottomLeft || bottomRight != _previousMagnifierBottomRight - || topLeft != _previousMagnifierTopLeft || topRight != _previousMagnifierTopRight) { - QVector border; - border << topLeft; - border << bottomLeft; - border << bottomRight; - border << topRight; - border << topLeft; - geometryCache->updateVertices(_magnifierBorder, border, glm::vec4(1.0f, 0.0f, 0.0f, _alpha)); - - _previousMagnifierBottomLeft = bottomLeft; - _previousMagnifierBottomRight = bottomRight; - _previousMagnifierTopLeft = topLeft; - _previousMagnifierTopRight = topRight; - } - - glPushMatrix(); { - if (showBorder) { - glDisable(GL_TEXTURE_2D); - glLineWidth(1.0f); - //Outer Line - geometryCache->renderVertices(gpu::LINE_STRIP, _magnifierBorder); - glEnable(GL_TEXTURE_2D); - } - glm::vec4 magnifierColor = { 1.0f, 1.0f, 1.0f, _alpha }; - - DependencyManager::get()->renderQuad(bottomLeft, bottomRight, topRight, topLeft, - glm::vec2(magnifyULeft, magnifyVBottom), - glm::vec2(magnifyURight, magnifyVBottom), - glm::vec2(magnifyURight, magnifyVTop), - glm::vec2(magnifyULeft, magnifyVTop), - magnifierColor, _magnifierQuad); - - } glPopMatrix(); -} - void ApplicationCompositor::buildHemiVertices( const float fov, const float aspectRatio, const int slices, const int stacks) { static float textureFOV = 0.0f, textureAspectRatio = 1.0f; diff --git a/interface/src/ui/ApplicationCompositor.h b/interface/src/ui/ApplicationCompositor.h index 0f89f81d26..5df145afa2 100644 --- a/interface/src/ui/ApplicationCompositor.h +++ b/interface/src/ui/ApplicationCompositor.h @@ -77,7 +77,6 @@ private: void updateTooltips(); void renderPointers(gpu::Batch& batch); - void renderMagnifier(gpu::Batch& batch, const glm::vec2& magPos, float sizeMult, bool showBorder); void renderControllerPointers(gpu::Batch& batch); void renderPointersOculus(gpu::Batch& batch); From 819fa852b8ca4e74606df37357f489cf9550f722 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 12:47:59 -0700 Subject: [PATCH 41/44] first pass at GlowEctomy --- interface/src/Application.cpp | 22 ++++++++-------- interface/src/Menu.cpp | 4 --- interface/src/Menu.h | 2 -- interface/src/avatar/Avatar.cpp | 7 +----- interface/src/avatar/AvatarManager.cpp | 1 - interface/src/devices/OculusManager.cpp | 25 ++++--------------- interface/src/devices/TV3DManager.cpp | 8 +++++- interface/src/ui/overlays/Cube3DOverlay.cpp | 1 - interface/src/ui/overlays/Line3DOverlay.cpp | 1 - .../src/ui/overlays/LocalModelsOverlay.cpp | 12 +-------- interface/src/ui/overlays/ModelOverlay.cpp | 2 -- .../src/ui/overlays/Rectangle3DOverlay.cpp | 1 - interface/src/ui/overlays/Sphere3DOverlay.cpp | 1 - .../src/EntityTreeRenderer.cpp | 1 - .../src/RenderableWebEntityItem.cpp | 2 -- .../src/AmbientOcclusionEffect.cpp | 5 ++-- libraries/render-utils/src/Model.cpp | 4 +-- tests/ui/src/main.cpp | 1 - 18 files changed, 28 insertions(+), 72 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dec179d479..373610087b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -65,7 +65,6 @@ #include #include #include -#include #include #include #include @@ -99,6 +98,8 @@ #include #include +#include // FIXME + #include "Application.h" #include "AudioClient.h" #include "DiscoverabilityManager.h" @@ -269,7 +270,7 @@ bool setupEssentials(int& argc, char** argv) { auto geometryCache = DependencyManager::set(); auto scriptCache = DependencyManager::set(); auto soundCache = DependencyManager::set(); - auto glowEffect = DependencyManager::set(); + auto glowEffect = DependencyManager::set(); // FIXME auto faceshift = DependencyManager::set(); auto audio = DependencyManager::set(); auto audioScope = DependencyManager::set(); @@ -974,7 +975,10 @@ void Application::paintGL() { } else { PROFILE_RANGE(__FUNCTION__ "/mainRender"); - DependencyManager::get()->prepare(&renderArgs); + auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); + GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Viewport is assigned to the size of the framebuffer QSize size = DependencyManager::get()->getFrameBufferSize(); @@ -993,8 +997,7 @@ void Application::paintGL() { renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; - auto finalFbo = DependencyManager::get()->render(&renderArgs); - + auto finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); @@ -1002,6 +1005,8 @@ void Application::paintGL() { 0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height(), GL_COLOR_BUFFER_BIT, GL_LINEAR); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + + glBindTexture(GL_TEXTURE_2D, 0); // ??? _compositor.displayOverlayTexture(&renderArgs); } @@ -2230,10 +2235,6 @@ void Application::init() { _entityClipboardRenderer.setViewFrustum(getViewFrustum()); _entityClipboardRenderer.setTree(&_entityClipboard); - // initialize the GlowEffect with our widget - bool glow = Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect); - DependencyManager::get()->init(glow); - // Make sure any new sounds are loaded as soon as know about them. connect(tree, &EntityTree::newCollisionSoundURL, DependencyManager::get().data(), &SoundCache::getSound); connect(_myAvatar, &MyAvatar::newCollisionSoundURL, DependencyManager::get().data(), &SoundCache::getSound); @@ -3193,9 +3194,6 @@ QImage Application::renderAvatarBillboard(RenderArgs* renderArgs) { glClear(GL_COLOR_BUFFER_BIT); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - // the "glow" here causes an alpha of one - Glower glower(renderArgs); - const int BILLBOARD_SIZE = 64; // TODO: Pass a RenderArgs to renderAvatarBillboard renderRearViewMirror(renderArgs, QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index f292ff2d2a..7fd1e81edc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -246,7 +245,6 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ScriptedMotorControl, 0, true, avatar, SLOT(updateMotionBehavior())); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::NamesAboveHeads, 0, true); - addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::GlowWhenSpeaking, 0, true); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::BlueSpeechSphere, 0, true); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::EnableCharacterController, 0, true, avatar, SLOT(updateMotionBehavior())); @@ -385,8 +383,6 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Stars, 0, // QML Qt::Key_Asterisk, true); - addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::EnableGlowEffect, 0, true, - DependencyManager::get().data(), SLOT(toggleGlowEffect(bool))); addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Wireframe, Qt::ALT | Qt::Key_W, false); addActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LodTools, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index b9efef0159..01cbcaffac 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -185,7 +185,6 @@ namespace MenuOption { const QString EditEntitiesHelp = "Edit Entities Help..."; const QString Enable3DTVMode = "Enable 3DTV Mode"; const QString EnableCharacterController = "Enable avatar collisions"; - const QString EnableGlowEffect = "Enable Glow Effect"; const QString EnableVRMode = "Enable VR Mode"; const QString ExpandMyAvatarSimulateTiming = "Expand /myAvatar/simulation"; const QString ExpandMyAvatarTiming = "Expand /myAvatar"; @@ -199,7 +198,6 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString Fullscreen = "Fullscreen"; const QString FullscreenMirror = "Fullscreen Mirror"; - const QString GlowWhenSpeaking = "Glow When Speaking"; const QString HMDTools = "HMD Tools"; const QString IncreaseAvatarSize = "Increase Avatar Size"; const QString IndependentMode = "Independent Mode"; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b9acc84e1f..d0268fd936 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include @@ -410,9 +409,7 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo float GLOW_FROM_AVERAGE_LOUDNESS = ((this == DependencyManager::get()->getMyAvatar()) ? 0.0f : MAX_GLOW * getHeadData()->getAudioLoudness() / GLOW_MAX_LOUDNESS); - if (!Menu::getInstance()->isOptionChecked(MenuOption::GlowWhenSpeaking)) { - GLOW_FROM_AVERAGE_LOUDNESS = 0.0f; - } + GLOW_FROM_AVERAGE_LOUDNESS = 0.0f; float glowLevel = _moving && distanceToTarget > GLOW_DISTANCE && renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE ? 1.0f @@ -579,8 +576,6 @@ void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool fixupModelsInScene(); { - Glower glower(renderArgs, glowLevel); - if (_shouldRenderBillboard || !(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { if (postLighting || renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) { // render the billboard until both models are loaded diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 8e7a03685b..41d637eb38 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -25,7 +25,6 @@ #endif -#include #include #include #include diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 7bab6f58b9..ec3eaa0c03 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include @@ -644,15 +643,9 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const return; } - //Bind our framebuffer object. If we are rendering the glow effect, we let the glow effect shader take care of it - if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { - DependencyManager::get()->prepare(renderArgs); - } else { - auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO)); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - } - + auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); + glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO)); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); @@ -723,15 +716,8 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const glPopMatrix(); gpu::FramebufferPointer finalFbo; - //Bind the output texture from the glow shader. If glow effect is disabled, we just grab the texture - if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { - //Full texture viewport for glow effect - glViewport(0, 0, _renderTargetSize.w, _renderTargetSize.h); - finalFbo = DependencyManager::get()->render(renderArgs); - } else { - finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } + finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); + glBindFramebuffer(GL_FRAMEBUFFER, 0); glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -824,7 +810,6 @@ glm::quat OculusManager::getOrientation() { return toGlm(trackingState.HeadPose.ThePose.Orientation); } -//Used to set the size of the glow framebuffers QSize OculusManager::getRenderTargetSize() { QSize rv; rv.setWidth(_renderTargetSize.w); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index e945b5e79a..e9b28a3777 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -14,7 +14,6 @@ #include #include -#include #include "gpu/GLBackend.h" #include "Application.h" @@ -82,6 +81,9 @@ void TV3DManager::configureCamera(Camera& whichCamera, int screenWidth, int scre } void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { + +#ifdef THIS_CURRENTLY_BROKEN_WAITING_FOR_DISPLAY_PLUGINS + double nearZ = DEFAULT_NEAR_CLIP; // near clipping plane double farZ = DEFAULT_FAR_CLIP; // far clipping plane @@ -94,6 +96,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { int portalH = deviceSize.height(); + // FIXME - glow effect is removed, 3D TV mode broken until we get display plugins working DependencyManager::get()->prepare(renderArgs); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -128,6 +131,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { glPopMatrix(); glDisable(GL_SCISSOR_TEST); + // FIXME - glow effect is removed, 3D TV mode broken until we get display plugins working auto finalFbo = DependencyManager::get()->render(renderArgs); auto fboSize = finalFbo->getSize(); // Get the ACTUAL device size for the BLIT @@ -142,6 +146,8 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { // reset the viewport to how we started glViewport(0, 0, deviceSize.width(), deviceSize.height()); + +#endif } void TV3DManager::overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 433a55e231..3455ce2e51 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -12,7 +12,6 @@ #include "InterfaceConfig.h" #include -#include #include #include diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 0abc86d7ad..4e2763d260 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -11,7 +11,6 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" -#include #include #include diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp index 6e0b53f0c2..06b27f8f22 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalModelsOverlay.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - #include "Application.h" #include "LocalModelsOverlay.h" @@ -32,11 +30,7 @@ void LocalModelsOverlay::update(float deltatime) { void LocalModelsOverlay::render(RenderArgs* args) { if (_visible) { - float glowLevel = getGlowLevel(); - Glower* glower = NULL; - if (glowLevel > 0.0f) { - glower = new Glower(glowLevel); - } + float glowLevel = getGlowLevel(); // FIXME, glowing removed for now auto batch = args ->_batch; Application* app = Application::getInstance(); @@ -47,10 +41,6 @@ void LocalModelsOverlay::render(RenderArgs* args) { _entityTreeRenderer->render(args); transform.setTranslation(oldTranslation); batch->setViewTransform(transform); - - if (glower) { - delete glower; - } } } diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 4476518efe..5a399aef76 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -12,8 +12,6 @@ #include "ModelOverlay.h" #include -#include - ModelOverlay::ModelOverlay() : _model(), diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index dfe5a3ad74..0ab9174da8 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -14,7 +14,6 @@ #include "Rectangle3DOverlay.h" #include -#include #include Rectangle3DOverlay::Rectangle3DOverlay() : diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 259fe98acf..8d751c73c5 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -11,7 +11,6 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" -#include #include #include "Sphere3DOverlay.h" diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 0abd5b21cb..43f3492091 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index cf602971c2..95147ef2b1 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -14,7 +14,6 @@ #include -#include #include #include #include @@ -169,7 +168,6 @@ void RenderableWebEntityItem::render(RenderArgs* args) { _webSurface->resize(QSize(dims.x, dims.y)); currentContext->makeCurrent(currentSurface); - Glower glow(0.0f); PerformanceTimer perfTimer("RenderableWebEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Web); static const glm::vec2 texMin(0.0f), texMax(1.0f), topLeft(-0.5f), bottomRight(0.5f); diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index f58419ec6e..8a77d4090a 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -21,7 +21,6 @@ #include "AbstractViewStateInterface.h" #include "AmbientOcclusionEffect.h" -#include "GlowEffect.h" #include "ProgramObject.h" #include "RenderUtil.h" #include "TextureCache.h" @@ -107,7 +106,7 @@ void AmbientOcclusionEffect::render() { glBindTexture(GL_TEXTURE_2D, _rotationTextureID); // render with the occlusion shader to the secondary/tertiary buffer - auto freeFramebuffer = DependencyManager::get()->getFreeFramebuffer(); + auto freeFramebuffer = nullptr; // DependencyManager::get()->getFreeFramebuffer(); // FIXME glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(freeFramebuffer)); float left, right, bottom, top, nearVal, farVal; @@ -150,7 +149,7 @@ void AmbientOcclusionEffect::render() { glEnable(GL_BLEND); glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); - auto freeFramebufferTexture = freeFramebuffer->getRenderBuffer(0); + auto freeFramebufferTexture = nullptr; // freeFramebuffer->getRenderBuffer(0); // FIXME glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(freeFramebufferTexture)); _blurProgram->bind(); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 539dd02a78..6385041959 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -32,7 +32,6 @@ #include "AbstractViewStateInterface.h" #include "AnimationHandle.h" #include "DeferredLightingEffect.h" -#include "GlowEffect.h" #include "Model.h" #include "RenderUtilsLogging.h" @@ -2215,7 +2214,8 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f } if ((locations->glowIntensity > -1) && (mode != RenderArgs::SHADOW_RENDER_MODE)) { - GLBATCH(glUniform1f)(locations->glowIntensity, DependencyManager::get()->getIntensity()); + const float DEFAULT_GLOW_INTENSITY = 1.0f; // FIXME - glow is removed + GLBATCH(glUniform1f)(locations->glowIntensity, DEFAULT_GLOW_INTENSITY); } } diff --git a/tests/ui/src/main.cpp b/tests/ui/src/main.cpp index 1b0c7e0ab1..f5647bd176 100644 --- a/tests/ui/src/main.cpp +++ b/tests/ui/src/main.cpp @@ -131,7 +131,6 @@ public: EditEntitiesHelp, Enable3DTVMode, EnableCharacterController, - EnableGlowEffect, EnableVRMode, ExpandMyAvatarSimulateTiming, ExpandMyAvatarTiming, From c17794849d76fdb171b575448be12a4f60bfd9ae Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 12:58:15 -0700 Subject: [PATCH 42/44] more GlowEctomy --- interface/src/Application.cpp | 3 - .../src/DeferredLightingEffect.cpp | 5 +- libraries/render-utils/src/GlowEffect.cpp | 225 ------------------ libraries/render-utils/src/GlowEffect.h | 97 -------- 4 files changed, 2 insertions(+), 328 deletions(-) delete mode 100644 libraries/render-utils/src/GlowEffect.cpp delete mode 100644 libraries/render-utils/src/GlowEffect.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 373610087b..b85297c3cf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -98,8 +98,6 @@ #include #include -#include // FIXME - #include "Application.h" #include "AudioClient.h" #include "DiscoverabilityManager.h" @@ -270,7 +268,6 @@ bool setupEssentials(int& argc, char** argv) { auto geometryCache = DependencyManager::set(); auto scriptCache = DependencyManager::set(); auto soundCache = DependencyManager::set(); - auto glowEffect = DependencyManager::set(); // FIXME auto faceshift = DependencyManager::set(); auto audio = DependencyManager::set(); auto audioScope = DependencyManager::set(); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index b2db089bbe..4737929cf6 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -18,7 +18,6 @@ #include "AbstractViewStateInterface.h" #include "DeferredLightingEffect.h" #include "GeometryCache.h" -#include "GlowEffect.h" #include "RenderUtil.h" #include "TextureCache.h" @@ -238,7 +237,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { QSize framebufferSize = textureCache->getFrameBufferSize(); // binding the first framebuffer - auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); + auto freeFBO = DependencyManager::get()->getSecondaryFramebuffer(); batch.setFramebuffer(freeFBO); batch.clearColorFramebuffer(freeFBO->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); @@ -547,7 +546,7 @@ void DeferredLightingEffect::copyBack(RenderArgs* args) { auto textureCache = DependencyManager::get(); QSize framebufferSize = textureCache->getFrameBufferSize(); - auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); + auto freeFBO = DependencyManager::get()->getSecondaryFramebuffer(); batch.setFramebuffer(textureCache->getPrimaryFramebuffer()); batch.setPipeline(_blitLightBuffer); diff --git a/libraries/render-utils/src/GlowEffect.cpp b/libraries/render-utils/src/GlowEffect.cpp deleted file mode 100644 index 2e8b58c6c2..0000000000 --- a/libraries/render-utils/src/GlowEffect.cpp +++ /dev/null @@ -1,225 +0,0 @@ -// -// GlowEffect.cpp -// interface/src/renderer -// -// Created by Andrzej Kapolka on 8/7/13. -// Copyright 2013 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 this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL -#include - -#include -#include - -#include -#include - -#include "GlowEffect.h" -#include "ProgramObject.h" -#include "RenderUtil.h" -#include "TextureCache.h" -#include "RenderUtilsLogging.h" - -#include "gpu/GLBackend.h" - -GlowEffect::GlowEffect() - : _initialized(false), - _isOddFrame(false), - _isFirstFrame(true), - _intensity(0.0f), - _enabled(false) { -} - -GlowEffect::~GlowEffect() { - if (_initialized) { - delete _addProgram; - delete _horizontalBlurProgram; - delete _verticalBlurAddProgram; - delete _verticalBlurProgram; - delete _addSeparateProgram; - delete _diffuseProgram; - } -} - -gpu::FramebufferPointer GlowEffect::getFreeFramebuffer() const { - return (_isOddFrame ? - DependencyManager::get()->getSecondaryFramebuffer(): - DependencyManager::get()->getTertiaryFramebuffer()); -} - -static ProgramObject* createProgram(const QString& name) { - ProgramObject* program = new ProgramObject(); - program->addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/" + name + ".frag"); - program->link(); - - program->bind(); - program->setUniformValue("originalTexture", 0); - program->release(); - - return program; -} - -void GlowEffect::init(bool enabled) { - if (_initialized) { - qCDebug(renderutils, "[ERROR] GlowEffeect is already initialized."); - return; - } - - _addProgram = createProgram("glow_add"); - _horizontalBlurProgram = createProgram("horizontal_blur"); - _verticalBlurAddProgram = createProgram("vertical_blur_add"); - _verticalBlurProgram = createProgram("vertical_blur"); - _addSeparateProgram = createProgram("glow_add_separate"); - _diffuseProgram = createProgram("diffuse"); - - _verticalBlurAddProgram->bind(); - _verticalBlurAddProgram->setUniformValue("horizontallyBlurredTexture", 1); - _verticalBlurAddProgram->release(); - - _addSeparateProgram->bind(); - _addSeparateProgram->setUniformValue("blurredTexture", 1); - _addSeparateProgram->release(); - - _diffuseProgram->bind(); - _diffuseProgram->setUniformValue("diffusedTexture", 1); - _diffuseProgram->release(); - - _diffusionScaleLocation = _diffuseProgram->uniformLocation("diffusionScale"); - - _initialized = true; - _enabled = enabled; -} - -void GlowEffect::prepare(RenderArgs* renderArgs) { - auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); - GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - _isEmpty = true; - _isOddFrame = !_isOddFrame; -} - -void GlowEffect::begin(RenderArgs* renderArgs, float intensity) { - // store the current intensity and add the new amount - _intensityStack.push(_intensity); - glBlendColor(0.0f, 0.0f, 0.0f, _intensity += intensity); - _isEmpty &= (_intensity == 0.0f); -} - -void GlowEffect::end(RenderArgs* renderArgs) { - // restore the saved intensity - glBlendColor(0.0f, 0.0f, 0.0f, _intensity = _intensityStack.pop()); -} - -gpu::FramebufferPointer GlowEffect::render(RenderArgs* renderArgs) { - PerformanceTimer perfTimer("glowEffect"); - - auto textureCache = DependencyManager::get(); - - auto primaryFBO = gpu::GLBackend::getFramebufferID(textureCache->getPrimaryFramebuffer()); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glBindTexture(GL_TEXTURE_2D, textureCache->getPrimaryColorTextureID()); - auto framebufferSize = textureCache->getFrameBufferSize(); - - glPushMatrix(); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glDisable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glDepthMask(GL_FALSE); - - gpu::FramebufferPointer destFBO = textureCache->getSecondaryFramebuffer(); - if (!_enabled || _isEmpty) { - // copy the primary to the screen - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(destFBO)); - glBindFramebuffer(GL_READ_FRAMEBUFFER, primaryFBO); - glBlitFramebuffer( - 0, 0, framebufferSize.width(), framebufferSize.height(), - 0, 0, framebufferSize.width(), framebufferSize.height(), - GL_COLOR_BUFFER_BIT, GL_NEAREST); - } else { - // diffuse into the secondary/tertiary (alternating between frames) - auto oldDiffusedFBO = - textureCache->getSecondaryFramebuffer(); - auto newDiffusedFBO = - textureCache->getTertiaryFramebuffer(); - if (_isOddFrame) { - qSwap(oldDiffusedFBO, newDiffusedFBO); - } - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(newDiffusedFBO)); - - if (_isFirstFrame) { - glClear(GL_COLOR_BUFFER_BIT); - - } else { - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(oldDiffusedFBO->getRenderBuffer(0))); - - _diffuseProgram->bind(); - - _diffuseProgram->setUniformValue(_diffusionScaleLocation, 1.0f / framebufferSize.width(), 1.0f / framebufferSize.height()); - - renderFullscreenQuad(); - - _diffuseProgram->release(); - } - - destFBO = oldDiffusedFBO; - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - // add diffused texture to the primary - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(newDiffusedFBO->getRenderBuffer(0))); - - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(destFBO)); - glViewport(0, 0, framebufferSize.width(), framebufferSize.height()); - _addSeparateProgram->bind(); - renderFullscreenQuad(); - _addSeparateProgram->release(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glBindTexture(GL_TEXTURE_2D, 0); - glActiveTexture(GL_TEXTURE0); - } - - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - glEnable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - glDepthMask(GL_TRUE); - glBindTexture(GL_TEXTURE_2D, 0); - - _isFirstFrame = false; - - return destFBO; -} - -void GlowEffect::toggleGlowEffect(bool enabled) { - _enabled = enabled; -} - -Glower::Glower(float amount) { - RenderArgs renderArgs; - DependencyManager::get()->begin(&renderArgs, amount); -} -Glower::Glower(RenderArgs* renderArgs, float amount) : _renderArgs(renderArgs) { - DependencyManager::get()->begin(_renderArgs, amount); -} - -Glower::~Glower() { - DependencyManager::get()->end(_renderArgs); -} - diff --git a/libraries/render-utils/src/GlowEffect.h b/libraries/render-utils/src/GlowEffect.h deleted file mode 100644 index 23a21a9575..0000000000 --- a/libraries/render-utils/src/GlowEffect.h +++ /dev/null @@ -1,97 +0,0 @@ -// -// GlowEffect.h -// interface/src/renderer -// -// Created by Andrzej Kapolka on 8/7/13. -// Copyright 2013 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_GlowEffect_h -#define hifi_GlowEffect_h - -#include -#include - -#include "RenderArgs.h" - -#include -#include -#include - -#include - -class ProgramObject; - -/// A generic full screen glow effect. -class GlowEffect : public QObject, public Dependency { - Q_OBJECT - SINGLETON_DEPENDENCY - -public: - - /// Returns a pointer to the framebuffer object that the glow effect is *not* using for persistent state - /// (either the secondary or the tertiary). - gpu::FramebufferPointer getFreeFramebuffer() const; - - void init(bool enabled); - - /// Prepares the glow effect for rendering the current frame. To be called before rendering the scene. - void prepare(RenderArgs* renderArgs); - - /// Starts using the glow effect. - /// \param intensity the desired glow intensity, from zero to one - void begin(RenderArgs* renderArgs, float intensity = 1.0f); - - /// Stops using the glow effect. - void end(RenderArgs* renderArgs); - - /// Returns the current glow intensity. - float getIntensity() const { return _intensity; } - - /// Renders the glow effect. To be called after rendering the scene. - /// \param toTexture whether to render to a texture, rather than to the frame buffer - /// \return the framebuffer object to which we rendered, or NULL if to the frame buffer - gpu::FramebufferPointer render(RenderArgs* renderArgs); - -public slots: - void toggleGlowEffect(bool enabled); - -private: - GlowEffect(); - virtual ~GlowEffect(); - - bool _initialized; - - ProgramObject* _addProgram; - ProgramObject* _horizontalBlurProgram; - ProgramObject* _verticalBlurAddProgram; - ProgramObject* _verticalBlurProgram; - ProgramObject* _addSeparateProgram; - ProgramObject* _diffuseProgram; - int _diffusionScaleLocation; - - bool _isEmpty; ///< set when nothing in the scene is currently glowing - bool _isOddFrame; ///< controls the alternation between texture targets in diffuse add mode - bool _isFirstFrame; ///< for persistent modes, notes whether this is the first frame rendered - - float _intensity; - QStack _intensityStack; - bool _enabled; -}; - -/// RAII-style glow handler. Applies glow when in scope. -class Glower { -public: - - Glower(float amount = 1.0f); - Glower(RenderArgs* renderArgs, float amount = 1.0f); - ~Glower(); - -private: - RenderArgs* _renderArgs; -}; - -#endif // hifi_GlowEffect_h From ff288fdd5d287118abafe5b528ce9777d2062f89 Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Wed, 15 Jul 2015 13:09:55 -0700 Subject: [PATCH 43/44] While we work on FPS I have decreased the default LOD FPS While we work on FPS I have decreased the default LOD FPS. In a new users preferences this will now show as 15 desktop and 30 HMD. --- interface/src/LODManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 98ababbda0..b0185b528f 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -17,8 +17,8 @@ #include #include -const float DEFAULT_DESKTOP_LOD_DOWN_FPS = 30.0; -const float DEFAULT_HMD_LOD_DOWN_FPS = 60.0; +const float DEFAULT_DESKTOP_LOD_DOWN_FPS = 15.0; +const float DEFAULT_HMD_LOD_DOWN_FPS = 30.0; const float MAX_LIKELY_DESKTOP_FPS = 59.0; // this is essentially, V-synch - 1 fps const float MAX_LIKELY_HMD_FPS = 74.0; // this is essentially, V-synch - 1 fps const float INCREASE_LOD_GAP = 15.0f; From 849b584596c095e25c56c6d49fea90302a8cf939 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 15 Jul 2015 13:16:38 -0700 Subject: [PATCH 44/44] more GlowEctomy --- interface/src/Menu.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7fd1e81edc..8b14830c2d 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include #include