From 4d0c8191734eafee06cf3bad40997f02339f97d6 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 16 Aug 2016 13:26:33 -0700 Subject: [PATCH 1/5] remove peaking irradiance from default background --- 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 8b401b132d..16d5fb3ee0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4279,7 +4279,7 @@ namespace render { sceneKeyLight->setDirection(DEFAULT_SKYBOX_DIRECTION); auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture(); - sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); + // do not set the ambient sphere - it peaks too high, and causes flashing when turning sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); qApp->getDefaultSkybox()->render(batch, args->getViewFrustum()); From 8c559bc65d7b1904d8de80153030d1a10f324695 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 16 Aug 2016 13:27:22 -0700 Subject: [PATCH 2/5] use lights from nontextured skyboxes --- interface/src/Application.cpp | 56 ++++++++------- .../src/EntityTreeRenderer.cpp | 72 ++++++++----------- .../src/EntityTreeRenderer.h | 14 +--- libraries/model/src/model/Stage.cpp | 15 ---- libraries/model/src/model/Stage.h | 6 +- tests/render-perf/src/main.cpp | 4 -- 6 files changed, 65 insertions(+), 102 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 16d5fb3ee0..1eb1bd3535 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4253,6 +4253,21 @@ namespace render { auto backgroundMode = skyStage->getBackgroundMode(); switch (backgroundMode) { + case model::SunSkyStage::SKY_DEFAULT: { + static const glm::vec3 DEFAULT_SKYBOX_COLOR{ 255.0f / 255.0f, 220.0f / 255.0f, 194.0f / 255.0f }; + static const float DEFAULT_SKYBOX_INTENSITY{ 0.2f }; + static const float DEFAULT_SKYBOX_AMBIENT_INTENSITY{ 2.0f }; + static const glm::vec3 DEFAULT_SKYBOX_DIRECTION{ 0.0f, 0.0f, -1.0f }; + + auto scene = DependencyManager::get()->getStage(); + auto sceneKeyLight = scene->getKeyLight(); + scene->setSunModelEnable(false); + sceneKeyLight->setColor(DEFAULT_SKYBOX_COLOR); + sceneKeyLight->setIntensity(DEFAULT_SKYBOX_INTENSITY); + sceneKeyLight->setAmbientIntensity(DEFAULT_SKYBOX_AMBIENT_INTENSITY); + sceneKeyLight->setDirection(DEFAULT_SKYBOX_DIRECTION); + // fall through: render a skybox, if available + } case model::SunSkyStage::SKY_BOX: { auto skybox = skyStage->getSkybox(); if (skybox) { @@ -4260,33 +4275,22 @@ namespace render { skybox->render(batch, args->getViewFrustum()); break; } + // fall through: render defaults, if available } - - // Fall through: if no skybox is available, render the SKY_DOME - case model::SunSkyStage::SKY_DOME: { - if (Menu::getInstance()->isOptionChecked(MenuOption::DefaultSkybox)) { - static const glm::vec3 DEFAULT_SKYBOX_COLOR { 255.0f / 255.0f, 220.0f / 255.0f, 194.0f / 255.0f }; - static const float DEFAULT_SKYBOX_INTENSITY { 0.2f }; - static const float DEFAULT_SKYBOX_AMBIENT_INTENSITY { 2.0f }; - static const glm::vec3 DEFAULT_SKYBOX_DIRECTION { 0.0f, 0.0f, -1.0f }; - - auto scene = DependencyManager::get()->getStage(); - auto sceneKeyLight = scene->getKeyLight(); - scene->setSunModelEnable(false); - sceneKeyLight->setColor(DEFAULT_SKYBOX_COLOR); - sceneKeyLight->setIntensity(DEFAULT_SKYBOX_INTENSITY); - sceneKeyLight->setAmbientIntensity(DEFAULT_SKYBOX_AMBIENT_INTENSITY); - sceneKeyLight->setDirection(DEFAULT_SKYBOX_DIRECTION); - - auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture(); - // do not set the ambient sphere - it peaks too high, and causes flashing when turning - sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); - - qApp->getDefaultSkybox()->render(batch, args->getViewFrustum()); - } + case model::SunSkyStage::SKY_DEFAULT_AMBIENT_TEXTURE: { + if (Menu::getInstance()->isOptionChecked(MenuOption::DefaultSkybox)) { + auto scene = DependencyManager::get()->getStage(); + auto sceneKeyLight = scene->getKeyLight(); + auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture(); + // do not set the ambient sphere - it peaks too high, and causes flashing when turning + sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); + } + // fall through: render defaults, if available } - break; - + case model::SunSkyStage::SKY_DEFAULT_TEXTURE: + if (Menu::getInstance()->isOptionChecked(MenuOption::DefaultSkybox)) { + qApp->getDefaultSkybox()->render(batch, args->getViewFrustum()); + } case model::SunSkyStage::NO_BACKGROUND: default: // this line intentionally left blank @@ -4503,7 +4507,7 @@ void Application::clearDomainOctreeDetails() { auto skyStage = DependencyManager::get()->getSkyStage(); - skyStage->setBackgroundMode(model::SunSkyStage::SKY_DOME); + skyStage->setBackgroundMode(model::SunSkyStage::SKY_DEFAULT); _recentlyClearedDomain = true; } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 476e64e642..6ecf1813cf 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -351,10 +351,10 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr(skyStage->getSkybox()); - static QString userData; + // If there is no zone, use the default background if (!zone) { - userData = QString(); + _zoneUserData = QString(); skybox->clear(); _pendingSkyboxTexture = false; @@ -363,50 +363,31 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrresetAmbientSphere(); - sceneKeyLight->setAmbientMap(nullptr); - sceneKeyLight->setColor(_previousKeyLightColor); - sceneKeyLight->setIntensity(_previousKeyLightIntensity); - sceneKeyLight->setAmbientIntensity(_previousKeyLightAmbientIntensity); - sceneKeyLight->setDirection(_previousKeyLightDirection); - sceneStage->setSunModelEnable(_previousStageSunModelEnabled); - sceneStage->setLocation(_previousStageLongitude, _previousStageLatitude, - _previousStageAltitude); - sceneTime->setHour(_previousStageHour); - sceneTime->setDay(_previousStageDay); + sceneKeyLight->resetAmbientSphere(); + sceneKeyLight->setAmbientMap(nullptr); - _hasPreviousZone = false; - } - - skyStage->setBackgroundMode(model::SunSkyStage::SKY_DOME); // let the application background through - return; // Early exit - } - - if (!_hasPreviousZone) { - _previousKeyLightColor = sceneKeyLight->getColor(); - _previousKeyLightIntensity = sceneKeyLight->getIntensity(); - _previousKeyLightAmbientIntensity = sceneKeyLight->getAmbientIntensity(); - _previousKeyLightDirection = sceneKeyLight->getDirection(); - _previousStageSunModelEnabled = sceneStage->isSunModelEnabled(); - _previousStageLongitude = sceneLocation->getLongitude(); - _previousStageLatitude = sceneLocation->getLatitude(); - _previousStageAltitude = sceneLocation->getAltitude(); - _previousStageHour = sceneTime->getHour(); - _previousStageDay = sceneTime->getDay(); - _hasPreviousZone = true; + skyStage->setBackgroundMode(model::SunSkyStage::SKY_DEFAULT); + return; } + // Set the keylight sceneKeyLight->setColor(ColorUtils::toVec3(zone->getKeyLightProperties().getColor())); sceneKeyLight->setIntensity(zone->getKeyLightProperties().getIntensity()); sceneKeyLight->setAmbientIntensity(zone->getKeyLightProperties().getAmbientIntensity()); sceneKeyLight->setDirection(zone->getKeyLightProperties().getDirection()); - sceneStage->setSunModelEnable(zone->getStageProperties().getSunModelEnabled()); - sceneStage->setLocation(zone->getStageProperties().getLongitude(), zone->getStageProperties().getLatitude(), - zone->getStageProperties().getAltitude()); - sceneTime->setHour(zone->getStageProperties().calculateHour()); - sceneTime->setDay(zone->getStageProperties().calculateDay()); + // Set the stage + bool isSunModelEnabled = zone->getStageProperties().getSunModelEnabled(); + sceneStage->setSunModelEnable(isSunModelEnabled); + if (isSunModelEnabled) { + sceneStage->setLocation(zone->getStageProperties().getLongitude(), + zone->getStageProperties().getLatitude(), + zone->getStageProperties().getAltitude()); + sceneTime->setHour(zone->getStageProperties().calculateHour()); + sceneTime->setDay(zone->getStageProperties().calculateDay()); + } + + // Set the ambient texture bool isAmbientTextureSet = false; if (zone->getKeyLightProperties().getAmbientURL().isEmpty()) { _pendingAmbientTexture = false; @@ -429,12 +410,13 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrgetBackgroundMode()) { case BACKGROUND_MODE_SKYBOX: { skybox->setColor(zone->getSkyboxProperties().getColorVec3()); - if (userData != zone->getUserData()) { - userData = zone->getUserData(); - skybox->parse(userData); + if (_zoneUserData != zone->getUserData()) { + _zoneUserData = zone->getUserData(); + skybox->parse(_zoneUserData); } if (zone->getSkyboxProperties().getURL().isEmpty()) { skybox->setCubemap(nullptr); @@ -471,14 +453,18 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrclear(); _skyboxTexture.clear(); _pendingSkyboxTexture = false; // Let the application background through - skyStage->setBackgroundMode(model::SunSkyStage::SKY_DOME); + if (isAmbientTextureSet) { + skyStage->setBackgroundMode(model::SunSkyStage::SKY_DEFAULT_TEXTURE); + } else { + skyStage->setBackgroundMode(model::SunSkyStage::SKY_DEFAULT_AMBIENT_TEXTURE); + } break; } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 99c62ab5f6..cfd8595f78 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -185,25 +185,15 @@ private: QMultiMap _waitingOnPreload; - bool _hasPreviousZone { false }; std::shared_ptr _bestZone; float _bestZoneVolume; + QString _zoneUserData; + quint64 _lastZoneCheck { 0 }; const quint64 ZONE_CHECK_INTERVAL = USECS_PER_MSEC * 100; // ~10hz const float ZONE_CHECK_DISTANCE = 0.001f; - glm::vec3 _previousKeyLightColor; - float _previousKeyLightIntensity; - float _previousKeyLightAmbientIntensity; - glm::vec3 _previousKeyLightDirection; - bool _previousStageSunModelEnabled; - float _previousStageLongitude; - float _previousStageLatitude; - float _previousStageAltitude; - float _previousStageHour; - int _previousStageDay; - QHash _entitiesInScene; // For Scene.shouldRenderEntities QList _entityIDsLastInScene; diff --git a/libraries/model/src/model/Stage.cpp b/libraries/model/src/model/Stage.cpp index 23503ef6fb..6cfb77f2b2 100644 --- a/libraries/model/src/model/Stage.cpp +++ b/libraries/model/src/model/Stage.cpp @@ -244,21 +244,6 @@ void SunSkyStage::updateGraphicsObject() const { double originAlt = _earthSunModel.getAltitude(); _sunLight->setPosition(Vec3(0.0f, originAlt, 0.0f)); } - - // Background - switch (getBackgroundMode()) { - case NO_BACKGROUND: { - break; - } - case SKY_DOME: { - break; - } - case SKY_BOX: { - break; - } - case NUM_BACKGROUND_MODES: - Q_UNREACHABLE(); - }; } void SunSkyStage::setBackgroundMode(BackgroundMode mode) { diff --git a/libraries/model/src/model/Stage.h b/libraries/model/src/model/Stage.h index 335fb1c758..5f48824568 100644 --- a/libraries/model/src/model/Stage.h +++ b/libraries/model/src/model/Stage.h @@ -160,8 +160,10 @@ public: enum BackgroundMode { NO_BACKGROUND = 0, - SKY_DOME, + SKY_DEFAULT, SKY_BOX, + SKY_DEFAULT_AMBIENT_TEXTURE, + SKY_DEFAULT_TEXTURE, NUM_BACKGROUND_MODES, }; @@ -173,7 +175,7 @@ public: const SkyboxPointer& getSkybox() const { valid(); return _skybox; } protected: - BackgroundMode _backgroundMode = SKY_DOME; + BackgroundMode _backgroundMode = SKY_DEFAULT; LightPointer _sunLight; mutable SkyboxPointer _skybox; diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index 19dd875026..eec7e994ae 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -345,10 +345,6 @@ namespace render { break; } } - - // Fall through: if no skybox is available, render the SKY_DOME - case model::SunSkyStage::SKY_DOME: - case model::SunSkyStage::NO_BACKGROUND: default: // this line intentionally left blank break; From d6d9871a9692870d99c7377752a7f080263878c6 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 16 Aug 2016 14:36:54 -0700 Subject: [PATCH 3/5] unused var nits --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 6ecf1813cf..e36563681a 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -346,8 +346,6 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrgetStage(); auto skyStage = scene->getSkyStage(); auto sceneKeyLight = sceneStage->getKeyLight(); - auto sceneLocation = sceneStage->getLocation(); - auto sceneTime = sceneStage->getTime(); // Skybox and procedural skybox data auto skybox = std::dynamic_pointer_cast(skyStage->getSkybox()); @@ -383,6 +381,8 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrsetLocation(zone->getStageProperties().getLongitude(), zone->getStageProperties().getLatitude(), zone->getStageProperties().getAltitude()); + + auto sceneTime = sceneStage->getTime(); sceneTime->setHour(zone->getStageProperties().calculateHour()); sceneTime->setDay(zone->getStageProperties().calculateDay()); } From 2ff35768aa9ecfb9743ed35fd63939c8023befd1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 17 Aug 2016 18:45:09 -0700 Subject: [PATCH 4/5] make 3d-line overlays work again --- interface/src/ui/overlays/Line3DOverlay.cpp | 51 +++++++++++++++++++-- interface/src/ui/overlays/Line3DOverlay.h | 11 +++-- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 6b46b5b884..a50681cdb2 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -23,6 +23,7 @@ Line3DOverlay::Line3DOverlay() : Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) : Base3DOverlay(line3DOverlay), + _start(line3DOverlay->_start), _end(line3DOverlay->_end), _geometryCacheID(DependencyManager::get()->allocateID()) { @@ -31,6 +32,40 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) : Line3DOverlay::~Line3DOverlay() { } +const glm::vec3& Line3DOverlay::getStart() const { + bool success; + glm::vec3 worldStart = localToWorld(_start, _parentID, _parentJointIndex, success); + if (!success) { + qDebug() << "Line3DOverlay::getStart failed"; + } + return worldStart; +} + +const glm::vec3& Line3DOverlay::getEnd() const { + bool success; + glm::vec3 worldEnd = localToWorld(_end, _parentID, _parentJointIndex, success); + if (!success) { + qDebug() << "Line3DOverlay::getEnd failed"; + } + return worldEnd; +} + +void Line3DOverlay::setStart(const glm::vec3& start) { + bool success; + _start = worldToLocal(start, _parentID, _parentJointIndex, success); + if (!success) { + qDebug() << "Line3DOverlay::setStart failed"; + } +} + +void Line3DOverlay::setEnd(const glm::vec3& end) { + bool success; + _end = worldToLocal(end, _parentID, _parentJointIndex, success); + if (!success) { + qDebug() << "Line3DOverlay::setEnd failed"; + } +} + AABox Line3DOverlay::getBounds() const { auto extents = Extents{}; extents.addPoint(_start); @@ -76,8 +111,8 @@ const render::ShapeKey Line3DOverlay::getShapeKey() { return builder.build(); } -void Line3DOverlay::setProperties(const QVariantMap& properties) { - Base3DOverlay::setProperties(properties); +void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { + QVariantMap properties = originalProperties; auto start = properties["start"]; // if "start" property was not there, check to see if they included aliases: startPoint @@ -87,6 +122,7 @@ void Line3DOverlay::setProperties(const QVariantMap& properties) { if (start.isValid()) { setStart(vec3FromVariant(start)); } + properties.remove("start"); // so that Base3DOverlay doesn't respond to it auto end = properties["end"]; // if "end" property was not there, check to see if they included aliases: endPoint @@ -109,14 +145,16 @@ void Line3DOverlay::setProperties(const QVariantMap& properties) { if (glowWidth.isValid()) { setGlow(glowWidth.toFloat()); } + + Base3DOverlay::setProperties(properties); } QVariant Line3DOverlay::getProperty(const QString& property) { if (property == "start" || property == "startPoint" || property == "p1") { - return vec3toVariant(_start); + return vec3toVariant(getStart()); } if (property == "end" || property == "endPoint" || property == "p2") { - return vec3toVariant(_end); + return vec3toVariant(getEnd()); } return Base3DOverlay::getProperty(property); @@ -125,3 +163,8 @@ QVariant Line3DOverlay::getProperty(const QString& property) { Line3DOverlay* Line3DOverlay::createClone() const { return new Line3DOverlay(this); } + + +void Line3DOverlay::locationChanged(bool tellPhysics) { + // do nothing +} diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index d066677c70..2138ddc5da 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -28,14 +28,15 @@ public: virtual AABox getBounds() const override; // getters - const glm::vec3& getStart() const { return _start; } - const glm::vec3& getEnd() const { return _end; } + const glm::vec3& getStart() const; + const glm::vec3& getEnd() const; const float& getGlow() const { return _glow; } const float& getGlowWidth() const { return _glowWidth; } // setters - void setStart(const glm::vec3& start) { _start = start; } - void setEnd(const glm::vec3& end) { _end = end; } + void setStart(const glm::vec3& start); + void setEnd(const glm::vec3& end); + void setGlow(const float& glow) { _glow = glow; } void setGlowWidth(const float& glowWidth) { _glowWidth = glowWidth; } @@ -44,6 +45,8 @@ public: virtual Line3DOverlay* createClone() const override; + virtual void locationChanged(bool tellPhysics = true) override; + protected: glm::vec3 _start; glm::vec3 _end; From 8487f825a0ff1c924befa4f6a8cf0fd99ce3edff Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 18 Aug 2016 08:01:42 -0700 Subject: [PATCH 5/5] don't return reference to local variables --- interface/src/ui/overlays/Line3DOverlay.cpp | 4 ++-- interface/src/ui/overlays/Line3DOverlay.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index a50681cdb2..c3a6c5920e 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -32,7 +32,7 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) : Line3DOverlay::~Line3DOverlay() { } -const glm::vec3& Line3DOverlay::getStart() const { +glm::vec3 Line3DOverlay::getStart() const { bool success; glm::vec3 worldStart = localToWorld(_start, _parentID, _parentJointIndex, success); if (!success) { @@ -41,7 +41,7 @@ const glm::vec3& Line3DOverlay::getStart() const { return worldStart; } -const glm::vec3& Line3DOverlay::getEnd() const { +glm::vec3 Line3DOverlay::getEnd() const { bool success; glm::vec3 worldEnd = localToWorld(_end, _parentID, _parentJointIndex, success); if (!success) { diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index 2138ddc5da..b4e2ba8168 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -28,8 +28,8 @@ public: virtual AABox getBounds() const override; // getters - const glm::vec3& getStart() const; - const glm::vec3& getEnd() const; + glm::vec3 getStart() const; + glm::vec3 getEnd() const; const float& getGlow() const { return _glow; } const float& getGlowWidth() const { return _glowWidth; }