From 8976961bfb68b7c57e91b7b48ecd158253d9ac10 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 19 Oct 2017 16:27:39 -0700 Subject: [PATCH 01/39] add build config to draco install dir --- cmake/externals/draco/CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmake/externals/draco/CMakeLists.txt b/cmake/externals/draco/CMakeLists.txt index 44ddd6d3de..6a894e76b6 100644 --- a/cmake/externals/draco/CMakeLists.txt +++ b/cmake/externals/draco/CMakeLists.txt @@ -13,7 +13,7 @@ ExternalProject_Add( ${EXTERNAL_NAME} URL http://hifi-public.s3.amazonaws.com/dependencies/draco-1.1.0.zip URL_MD5 208f8b04c91d5f1c73d731a3ea37c5bb - CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= ${EXTRA_CMAKE_FLAGS} + CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=-$ ${EXTRA_CMAKE_FLAGS} LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 @@ -23,10 +23,11 @@ ExternalProject_Add( set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) +set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$") string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${INSTALL_DIR}/include CACHE PATH "List of Draco include directories") +set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories") if (UNIX) set(LIB_PREFIX "lib") @@ -35,6 +36,6 @@ elseif (WIN32) set(LIB_EXT "lib") endif () -set(${EXTERNAL_NAME_UPPER}_LIBRARY ${INSTALL_DIR}/lib/${LIB_PREFIX}draco.${LIB_EXT} CACHE FILEPATH "Path to Draco release library") -set(${EXTERNAL_NAME_UPPER}_ENCODER_LIBRARY ${INSTALL_DIR}/lib/${LIB_PREFIX}dracoenc.${LIB_EXT} CACHE FILEPATH "Path to Draco encoder release library") -set(${EXTERNAL_NAME_UPPER}_DECODER_LIBRARY ${INSTALL_DIR}/lib/${LIB_PREFIX}dracodec.${LIB_EXT} CACHE FILEPATH "Path to Draco decoder release library") +set(${EXTERNAL_NAME_UPPER}_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}draco.${LIB_EXT} CACHE FILEPATH "Path to Draco release library") +set(${EXTERNAL_NAME_UPPER}_ENCODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracoenc.${LIB_EXT} CACHE FILEPATH "Path to Draco encoder release library") +set(${EXTERNAL_NAME_UPPER}_DECODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracodec.${LIB_EXT} CACHE FILEPATH "Path to Draco decoder release library") From b5f1793863506ed6b9518c7af325fd0530b6bf2d Mon Sep 17 00:00:00 2001 From: David Back Date: Mon, 23 Oct 2017 14:21:18 -0700 Subject: [PATCH 02/39] add a tablet contextual mode flag to HMDScriptingInterface used to keep tablet in place --- interface/resources/qml/hifi/tablet/TabletRoot.qml | 2 +- interface/src/scripting/HMDScriptingInterface.cpp | 4 +++- interface/src/scripting/HMDScriptingInterface.h | 5 ++++- scripts/system/tablet-ui/tabletUI.js | 8 +++++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index ba9d06eee3..a161741049 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -219,7 +219,7 @@ Item { function setShown(value) { if (value === true) { - HMD.openTablet() + HMD.openTablet(HMD.tabletContextualMode) // pass in current contextual mode flag to maintain flag (otherwise uses default false argument) } else { HMD.closeTablet() } diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index 39d3164f1f..0b6800395f 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -100,10 +100,12 @@ void HMDScriptingInterface::deactivateHMDHandMouse() { void HMDScriptingInterface::closeTablet() { _showTablet = false; + _tabletContextualMode = false; } -void HMDScriptingInterface::openTablet() { +void HMDScriptingInterface::openTablet(bool contextualMode) { _showTablet = true; + _tabletContextualMode = contextualMode; } QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index e5040b1f90..76bab77cbb 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -30,6 +30,7 @@ class HMDScriptingInterface : public AbstractHMDScriptingInterface, public Depen Q_PROPERTY(glm::quat orientation READ getOrientation) Q_PROPERTY(bool mounted READ isMounted NOTIFY mountedChanged) Q_PROPERTY(bool showTablet READ getShouldShowTablet) + Q_PROPERTY(bool tabletContextualMode READ getTabletContextualMode) Q_PROPERTY(QUuid tabletID READ getCurrentTabletFrameID WRITE setCurrentTabletFrameID) Q_PROPERTY(QUuid homeButtonID READ getCurrentHomeButtonID WRITE setCurrentHomeButtonID) Q_PROPERTY(QUuid homeButtonHighlightID READ getCurrentHomeButtonHightlightID WRITE setCurrentHomeButtonHightlightID) @@ -75,7 +76,7 @@ public: Q_INVOKABLE void closeTablet(); - Q_INVOKABLE void openTablet(); + Q_INVOKABLE void openTablet(bool contextualMode = false); signals: bool shouldShowHandControllersChanged(); @@ -91,6 +92,7 @@ public: void toggleShouldShowTablet() { _showTablet = !_showTablet; } void setShouldShowTablet(bool value) { _showTablet = value; } bool getShouldShowTablet() const { return _showTablet; } + bool getTabletContextualMode() const { return _tabletContextualMode; } void setCurrentTabletFrameID(QUuid tabletID) { _tabletUIID = tabletID; } QUuid getCurrentTabletFrameID() const { return _tabletUIID; } @@ -106,6 +108,7 @@ public: private: bool _showTablet { false }; + bool _tabletContextualMode { false }; QUuid _tabletUIID; // this is the entityID of the tablet frame QUuid _tabletScreenID; // this is the overlayID which is part of (a child of) the tablet-ui. QUuid _homeButtonID; diff --git a/scripts/system/tablet-ui/tabletUI.js b/scripts/system/tablet-ui/tabletUI.js index 554729f61e..c10ded5774 100644 --- a/scripts/system/tablet-ui/tabletUI.js +++ b/scripts/system/tablet-ui/tabletUI.js @@ -124,7 +124,13 @@ print("TABLET in showTabletUI, already rezzed"); } var tabletProperties = {}; - UIWebTablet.calculateTabletAttachmentProperties(activeHand, true, tabletProperties); + if (HMD.tabletContextualMode) + print("DBACK tabletContextualMode"); + else + print("DBACK NOT tabletContextualMode"); + if (!HMD.tabletContextualMode) { // contextual mode forces tablet in place -> don't update attachment + UIWebTablet.calculateTabletAttachmentProperties(activeHand, true, tabletProperties); + } tabletProperties.visible = true; Overlays.editOverlay(HMD.tabletID, tabletProperties); Overlays.editOverlay(HMD.homeButtonID, { visible: true }); From 80dc98b2c2403c71f1011fed6134292dd5dcae28 Mon Sep 17 00:00:00 2001 From: David Back Date: Mon, 23 Oct 2017 14:23:45 -0700 Subject: [PATCH 03/39] remove prints --- scripts/system/tablet-ui/tabletUI.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/system/tablet-ui/tabletUI.js b/scripts/system/tablet-ui/tabletUI.js index c10ded5774..17821c737e 100644 --- a/scripts/system/tablet-ui/tabletUI.js +++ b/scripts/system/tablet-ui/tabletUI.js @@ -124,10 +124,6 @@ print("TABLET in showTabletUI, already rezzed"); } var tabletProperties = {}; - if (HMD.tabletContextualMode) - print("DBACK tabletContextualMode"); - else - print("DBACK NOT tabletContextualMode"); if (!HMD.tabletContextualMode) { // contextual mode forces tablet in place -> don't update attachment UIWebTablet.calculateTabletAttachmentProperties(activeHand, true, tabletProperties); } From 08a6eb4dd399ef4f5cdeca95ae4ab8fb50efe97f Mon Sep 17 00:00:00 2001 From: David Back Date: Tue, 24 Oct 2017 15:50:09 -0700 Subject: [PATCH 04/39] reset tablet contextual mode back to false when toggling tablet show/hide --- interface/src/scripting/HMDScriptingInterface.cpp | 9 +++++++++ interface/src/scripting/HMDScriptingInterface.h | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index 0b6800395f..31b8f74e9e 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -108,6 +108,15 @@ void HMDScriptingInterface::openTablet(bool contextualMode) { _tabletContextualMode = contextualMode; } +void HMDScriptingInterface::toggleShouldShowTablet() { + setShouldShowTablet(!getShouldShowTablet()); +} + +void HMDScriptingInterface::setShouldShowTablet(bool value) { + _showTablet = value; + _tabletContextualMode = false; +} + QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { glm::vec3 hudIntersection; auto instance = DependencyManager::get(); diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 76bab77cbb..ef8ea95704 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -89,8 +89,8 @@ public: bool isMounted() const; - void toggleShouldShowTablet() { _showTablet = !_showTablet; } - void setShouldShowTablet(bool value) { _showTablet = value; } + void toggleShouldShowTablet(); + void setShouldShowTablet(bool value); bool getShouldShowTablet() const { return _showTablet; } bool getTabletContextualMode() const { return _tabletContextualMode; } From b820f397fcba7488cb316d9f6d7ef9a1c6ba8cf7 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Thu, 26 Oct 2017 08:39:22 -0700 Subject: [PATCH 05/39] Fix zero-divide. --- libraries/model/src/model/Haze.h | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libraries/model/src/model/Haze.h b/libraries/model/src/model/Haze.h index fe606bf083..29eedcd372 100644 --- a/libraries/model/src/model/Haze.h +++ b/libraries/model/src/model/Haze.h @@ -30,10 +30,25 @@ namespace model { -LOG_P_005 / hazeRange_m.z); } - inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { return (-LOG_P_005 / hazeRange_m); } + + inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { + // limit range to no less than 1.0 metres + if (hazeRange_m < 1.0f) { + return -LOG_P_005; + } + else { + return -LOG_P_005 / hazeRange_m; + } + } inline float convertHazeAltitudeToHazeAltitudeFactor(const float hazeAltitude_m) { - return -LOG_P_005 / hazeAltitude_m; + // limit altitude to no less than 1.0 metres + if (hazeAltitude_m < 1.0) { + return -LOG_P_005; + } + else { + return -LOG_P_005 / hazeAltitude_m; + } } // Derivation (s is the proportion of sun blend, a is the angle at which the blend is 50%, solve for m = 0.5 From c5c996f18677dc598e3b4c94d56ff0bf7c9b9446 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Thu, 26 Oct 2017 09:21:38 -0700 Subject: [PATCH 06/39] Cleanup. --- libraries/model/src/model/Haze.h | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/libraries/model/src/model/Haze.h b/libraries/model/src/model/Haze.h index 29eedcd372..2ffdd2333b 100644 --- a/libraries/model/src/model/Haze.h +++ b/libraries/model/src/model/Haze.h @@ -16,8 +16,8 @@ #include "NumericalConstants.h" namespace model { - const float LOG_P_005 = (float)log(0.05); - const float LOG_P_05 = (float)log(0.5); + const float LOG_P_005 = logf(0.05f); + const float LOG_P_05 = logf(0.5f); // Derivation (d is distance, b is haze coefficient, f is attenuation, solve for f = 0.05 // f = exp(-d * b) @@ -30,26 +30,10 @@ namespace model { -LOG_P_005 / hazeRange_m.z); } + // limit range and altitude to no less than 1.0 metres + inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { return -LOG_P_005 / glm::max(hazeRange_m, 1.0f); } - inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { - // limit range to no less than 1.0 metres - if (hazeRange_m < 1.0f) { - return -LOG_P_005; - } - else { - return -LOG_P_005 / hazeRange_m; - } - } - - inline float convertHazeAltitudeToHazeAltitudeFactor(const float hazeAltitude_m) { - // limit altitude to no less than 1.0 metres - if (hazeAltitude_m < 1.0) { - return -LOG_P_005; - } - else { - return -LOG_P_005 / hazeAltitude_m; - } - } + inline float convertHazeAltitudeToHazeAltitudeFactor(const float hazeAltitude_m) { return -LOG_P_005 / glm::max(hazeAltitude_m, 1.0f); } // Derivation (s is the proportion of sun blend, a is the angle at which the blend is 50%, solve for m = 0.5 // s = dot(lookAngle, sunAngle) = cos(a) @@ -57,7 +41,7 @@ namespace model { // log(m) = p * log(s) // p = log(m) / log(s) inline float convertDirectionalLightAngleToPower(const float directionalLightAngle) { - return LOG_P_05 / (float)log(cos(RADIANS_PER_DEGREE * directionalLightAngle)); + return LOG_P_05 / logf(cosf(RADIANS_PER_DEGREE * directionalLightAngle)); } const glm::vec3 initialHazeColor{ 0.5f, 0.6f, 0.7f }; From ddd25da430a52d87c0e9d4fb2798205668b1dc07 Mon Sep 17 00:00:00 2001 From: beholder Date: Thu, 26 Oct 2017 17:35:28 +0300 Subject: [PATCH 07/39] 8315 Stylus appears in wrong place on hand --- .../controllerModules/tabletStylusInput.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scripts/system/controllers/controllerModules/tabletStylusInput.js b/scripts/system/controllers/controllerModules/tabletStylusInput.js index beb86d0ef4..46b630d023 100644 --- a/scripts/system/controllers/controllerModules/tabletStylusInput.js +++ b/scripts/system/controllers/controllerModules/tabletStylusInput.js @@ -154,6 +154,25 @@ Script.include("/~/system/libraries/controllers.js"); this.showStylus = function() { if (this.stylus) { + var X_ROT_NEG_90 = { x: -0.70710678, y: 0, z: 0, w: 0.70710678 }; + var modelOrientation = Quat.multiply(this.stylusTip.orientation, X_ROT_NEG_90); + var modelOrientationAngles = Quat.safeEulerAngles(modelOrientation); + + var rotation = Overlays.getProperty(this.stylus, "rotation"); + var rotationAngles = Quat.safeEulerAngles(rotation); + + if(!Vec3.withinEpsilon(modelOrientationAngles, rotationAngles, 1)) { + var modelPositionOffset = Vec3.multiplyQbyV(modelOrientation, { x: 0, y: 0, z: MyAvatar.sensorToWorldScale * -WEB_STYLUS_LENGTH / 2 }); + + var updatedStylusProperties = { + position: Vec3.sum(this.stylusTip.position, modelPositionOffset), + rotation: modelOrientation, + dimensions: Vec3.multiply(MyAvatar.sensorToWorldScale, { x: 0.01, y: 0.01, z: WEB_STYLUS_LENGTH }), + }; + + Overlays.editOverlay(this.stylus, updatedStylusProperties); + } + return; } From 901e14571211dd2a769aa4cdf96996838603ad26 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Oct 2017 22:57:33 -0700 Subject: [PATCH 08/39] remove redundant dimensionsChanged() --- libraries/entities/src/EntityItem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 008ec9769f..059e6bf151 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1754,7 +1754,6 @@ void EntityItem::updateDimensions(const glm::vec3& value) { setDimensions(value); markDirtyFlags(Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS); _queryAACubeSet = false; - dimensionsChanged(); } } From 474609dabf1cab9d65c886281dfa49e56b14f9f6 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Oct 2017 22:58:24 -0700 Subject: [PATCH 09/39] enforce dimensions of Circles and Quads --- libraries/entities/src/ShapeEntityItem.cpp | 44 ++++++++++++---------- libraries/entities/src/ShapeEntityItem.h | 2 + 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index 9a1a500a54..8c7d1576e1 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -104,6 +104,14 @@ void ShapeEntityItem::setShape(const entity::Shape& shape) { case entity::Shape::Sphere: _type = EntityTypes::Sphere; break; + case entity::Shape::Circle: + // Circle is implicitly flat so we enforce flat dimensions + setDimensions(getDimensions()); + break; + case entity::Shape::Quad: + // Quad is implicitly flat so we enforce flat dimensions + setDimensions(getDimensions()); + break; default: _type = EntityTypes::Shape; break; @@ -196,6 +204,18 @@ void ShapeEntityItem::setColor(const QColor& value) { setAlpha(value.alpha()); } +void ShapeEntityItem::setDimensions(const glm::vec3& value) { + const float MAX_FLAT_DIMENSION = 0.0001f; + if ((_shape == entity::Shape::Circle || _shape == entity::Shape::Quad) && value.y > MAX_FLAT_DIMENSION) { + // enforce flatness in Y + glm::vec3 newDimensions = value; + newDimensions.y = MAX_FLAT_DIMENSION; + EntityItem::setDimensions(newDimensions); + } else { + EntityItem::setDimensions(value); + } +} + bool ShapeEntityItem::supportsDetailedRayIntersection() const { return _shape == entity::Sphere; } @@ -249,13 +269,8 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { const glm::vec3 entityDimensions = getDimensions(); switch (_shape){ - case entity::Shape::Quad: { - // Not in GeometryCache::buildShapes, unsupported. - _collisionShapeType = SHAPE_TYPE_ELLIPSOID; - //TODO WL21389: Add a SHAPE_TYPE_QUAD ShapeType and treat - // as a special box (later if desired support) - } - break; + case entity::Shape::Quad: + // Quads collide like flat Cubes case entity::Shape::Cube: { _collisionShapeType = SHAPE_TYPE_BOX; } @@ -275,19 +290,10 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { } } break; - case entity::Shape::Circle: { - _collisionShapeType = SHAPE_TYPE_CIRCLE; - } - break; + case entity::Shape::Circle: + // Circles collide like flat Cylinders case entity::Shape::Cylinder: { _collisionShapeType = SHAPE_TYPE_CYLINDER_Y; - // TODO WL21389: determine if rotation is axis-aligned - //const Transform::Quat & rot = _transform.getRotation(); - - // TODO WL21389: some way to tell apart SHAPE_TYPE_CYLINDER_Y, _X, _Z based on rotation and - // hull ( or dimensions, need circular cross section) - // Should allow for minor variance along axes? - } break; case entity::Shape::Cone: { @@ -330,7 +336,7 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { case entity::Shape::Torus: { // Not in GeometryCache::buildShapes, unsupported. _collisionShapeType = SHAPE_TYPE_ELLIPSOID; - //TODO WL21389: SHAPE_TYPE_SIMPLE_HULL and pointCollection (later if desired support) + //TODO handle this shape more correctly } break; default: { diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index a88a2098e9..20e36c88e6 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -80,6 +80,8 @@ public: const rgbColor& getColor() const { return _color; } void setColor(const rgbColor& value); + void setDimensions(const glm::vec3& value) override; + xColor getXColor() const; void setColor(const xColor& value); From 2710dca37c70fa331f10ee80ad1232155d113961 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Oct 2017 22:58:50 -0700 Subject: [PATCH 10/39] fix rendering of Circles and Quads --- libraries/render-utils/src/GeometryCache.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index f35fb9f830..fa00737e3c 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -482,8 +482,10 @@ void GeometryCache::buildShapes() { using namespace geometry; auto vertexBuffer = std::make_shared(); auto indexBuffer = std::make_shared(); - // Cube + // Cube setupFlatShape(_shapes[Cube], geometry::cube(), _shapeVertices, _shapeIndices); + //Quad renders as flat Cube + setupFlatShape(_shapes[Quad], geometry::cube(), _shapeVertices, _shapeIndices); // Tetrahedron setupFlatShape(_shapes[Tetrahedron], geometry::tetrahedron(), _shapeVertices, _shapeIndices); // Icosahedron @@ -524,12 +526,10 @@ void GeometryCache::buildShapes() { extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices); //Cone, extrudePolygon<64>(_shapes[Cone], _shapeVertices, _shapeIndices, true); - //Circle - drawCircle(_shapes[Circle], _shapeVertices, _shapeIndices); + // Circle renders as flat Cylinder + extrudePolygon<64>(_shapes[Circle], _shapeVertices, _shapeIndices); // Not implemented yet: - //Quad, - //Torus, - + //Torus, } const GeometryCache::ShapeData * GeometryCache::getShapeData(const Shape shape) const { From 5ed58d5e5dc6012ed054f72ba3b60f6d0c3a7900 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 26 Oct 2017 22:59:25 -0700 Subject: [PATCH 11/39] enable Quad in ShapeEntityItem properties --- scripts/system/html/entityProperties.html | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 2d5dd35e66..d2c33984ff 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -59,6 +59,7 @@ +
From 66c31caf4b17a970a6b47419a4d7abf1318126bb Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Fri, 27 Oct 2017 09:08:58 -0700 Subject: [PATCH 12/39] Refactoring of the haze --- .../src/RenderableZoneEntityItem.cpp | 6 +- libraries/entities/CMakeLists.txt | 2 +- libraries/entities/src/HazePropertyGroup.cpp | 13 ---- libraries/entities/src/HazePropertyGroup.h | 33 +++------ libraries/entities/src/ZoneEntityItem.h | 19 ++--- libraries/model/src/model/Haze.cpp | 42 +++++------ libraries/model/src/model/Haze.h | 65 +++-------------- libraries/model/src/model/HazeInit.h | 69 +++++++++++++++++++ .../render-utils/src/DeferredGlobalLight.slh | 10 +-- .../src/DeferredLightingEffect.cpp | 4 +- libraries/render-utils/src/DrawHaze.cpp | 34 ++++----- libraries/render-utils/src/DrawHaze.h | 68 +++++++++--------- libraries/render-utils/src/Haze.slf | 20 +++--- libraries/render-utils/src/Haze.slh | 14 ++-- libraries/render-utils/src/HazeStage.cpp | 10 +-- libraries/render-utils/src/HazeStage.h | 44 ++++++------ scripts/system/html/entityProperties.html | 16 ++--- scripts/system/html/js/entityProperties.js | 28 ++++---- 18 files changed, 249 insertions(+), 248 deletions(-) create mode 100644 libraries/model/src/model/HazeInit.h diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 0235f1b7a3..877e245006 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -346,15 +346,15 @@ void ZoneEntityRenderer::updateHazeFromEntity(const TypedEntityPointer& entity) xColor hazeColor = _hazeProperties.getHazeColor(); haze->setHazeColor(glm::vec3(hazeColor.red / 255.0, hazeColor.green / 255.0, hazeColor.blue / 255.0)); xColor hazeGlareColor = _hazeProperties.getHazeGlareColor(); - haze->setDirectionalLightColor(glm::vec3(hazeGlareColor.red / 255.0, hazeGlareColor.green / 255.0, hazeGlareColor.blue / 255.0)); + haze->setHazeGlareColor(glm::vec3(hazeGlareColor.red / 255.0, hazeGlareColor.green / 255.0, hazeGlareColor.blue / 255.0)); haze->setHazeEnableGlare(_hazeProperties.getHazeEnableGlare()); - haze->setDirectionalLightBlend(model::convertDirectionalLightAngleToPower(_hazeProperties.getHazeGlareAngle())); + haze->setHazeGlareBlend(model::convertGlareAngleToPower(_hazeProperties.getHazeGlareAngle())); float hazeAltitude = _hazeProperties.getHazeCeiling() - _hazeProperties.getHazeBaseRef(); haze->setHazeAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(hazeAltitude)); haze->setHazeBaseReference(_hazeProperties.getHazeBaseRef()); - haze->setHazeBackgroundBlendValue(_hazeProperties.getHazeBackgroundBlend()); + haze->setHazeBackgroundBlend(_hazeProperties.getHazeBackgroundBlend()); haze->setHazeAttenuateKeyLight(_hazeProperties.getHazeAttenuateKeyLight()); haze->setHazeKeyLightRangeFactor(model::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeKeyLightRange())); diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index 322d69da16..c23740654e 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME entities) setup_hifi_library(Network Script) include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") -link_hifi_libraries(shared networking octree avatars) +link_hifi_libraries(shared networking octree avatars model) diff --git a/libraries/entities/src/HazePropertyGroup.cpp b/libraries/entities/src/HazePropertyGroup.cpp index 996d2e0cd3..3cc3e69960 100644 --- a/libraries/entities/src/HazePropertyGroup.cpp +++ b/libraries/entities/src/HazePropertyGroup.cpp @@ -15,19 +15,6 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -const float HazePropertyGroup::DEFAULT_HAZE_RANGE{ 1000.0f }; -const xColor HazePropertyGroup::DEFAULT_HAZE_COLOR{ 128, 154, 179 }; // Bluish -const xColor HazePropertyGroup::DEFAULT_HAZE_GLARE_COLOR{ 255, 229, 179 }; // Yellowish -const float HazePropertyGroup::DEFAULT_HAZE_GLARE_ANGLE{ 20.0 }; - -const float HazePropertyGroup::DEFAULT_HAZE_CEILING{ 200.0f }; -const float HazePropertyGroup::DEFAULT_HAZE_BASE_REF{ 0.0f }; - -const float HazePropertyGroup::DEFAULT_HAZE_BACKGROUND_BLEND{ 0.0f }; - -const float HazePropertyGroup::DEFAULT_HAZE_KEYLIGHT_RANGE{ 1000.0 }; -const float HazePropertyGroup::DEFAULT_HAZE_KEYLIGHT_ALTITUDE{ 200.0f }; - void HazePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index cdd36ff7ef..1cbaa24f2a 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -21,6 +21,8 @@ #include "PropertyGroup.h" #include "EntityItemPropertiesMacros.h" +#include + class EntityItemProperties; class EncodeBitstreamParams; class OctreePacketData; @@ -74,38 +76,25 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) override; - static const float DEFAULT_HAZE_RANGE; - static const xColor DEFAULT_HAZE_COLOR; - static const xColor DEFAULT_HAZE_GLARE_COLOR; - static const float DEFAULT_HAZE_GLARE_ANGLE; - - static const float DEFAULT_HAZE_CEILING; - static const float DEFAULT_HAZE_BASE_REF; - - static const float DEFAULT_HAZE_BACKGROUND_BLEND; - - static const float DEFAULT_HAZE_KEYLIGHT_RANGE; - static const float DEFAULT_HAZE_KEYLIGHT_ALTITUDE; - // Range only parameters - DEFINE_PROPERTY(PROP_HAZE_RANGE, HazeRange, hazeRange, float, DEFAULT_HAZE_RANGE); - DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, xColor, DEFAULT_HAZE_COLOR); - DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, xColor, DEFAULT_HAZE_GLARE_COLOR); + DEFINE_PROPERTY(PROP_HAZE_RANGE, HazeRange, hazeRange, float, model::initialHazeRange_m); + DEFINE_PROPERTY_REF(PROP_HAZE_COLOR, HazeColor, hazeColor, xColor, model::initialHazeColorXcolor); + DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_COLOR, HazeGlareColor, hazeGlareColor, xColor, model::initialHazeGlareColorXcolor); DEFINE_PROPERTY(PROP_HAZE_ENABLE_GLARE, HazeEnableGlare, hazeEnableGlare, bool, false); - DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_ANGLE, HazeGlareAngle, hazeGlareAngle, float, DEFAULT_HAZE_GLARE_ANGLE); + DEFINE_PROPERTY_REF(PROP_HAZE_GLARE_ANGLE, HazeGlareAngle, hazeGlareAngle, float, model::initialGlareAngle_degs); // Altitude parameters DEFINE_PROPERTY(PROP_HAZE_ALTITUDE_EFFECT, HazeAltitudeEffect, hazeAltitudeEffect, bool, false); - DEFINE_PROPERTY_REF(PROP_HAZE_CEILING, HazeCeiling, hazeCeiling, float, DEFAULT_HAZE_CEILING); - DEFINE_PROPERTY_REF(PROP_HAZE_BASE_REF, HazeBaseRef, hazeBaseRef, float, DEFAULT_HAZE_BASE_REF); + DEFINE_PROPERTY_REF(PROP_HAZE_CEILING, HazeCeiling, hazeCeiling, float, model::initialHazeBaseReference_m + model::initialHazeHeight_m); + DEFINE_PROPERTY_REF(PROP_HAZE_BASE_REF, HazeBaseRef, hazeBaseRef, float, model::initialHazeBaseReference_m); // Background (skybox) blend value - DEFINE_PROPERTY_REF(PROP_HAZE_BACKGROUND_BLEND, HazeBackgroundBlend, hazeBackgroundBlend, float, DEFAULT_HAZE_BACKGROUND_BLEND); + DEFINE_PROPERTY_REF(PROP_HAZE_BACKGROUND_BLEND, HazeBackgroundBlend, hazeBackgroundBlend, float, model::initialHazeBackgroundBlend); // hazeDirectional light attenuation DEFINE_PROPERTY(PROP_HAZE_ATTENUATE_KEYLIGHT, HazeAttenuateKeyLight, hazeAttenuateKeyLight, bool, false); - DEFINE_PROPERTY_REF(PROP_HAZE_KEYLIGHT_RANGE, HazeKeyLightRange, hazeKeyLightRange, float, DEFAULT_HAZE_KEYLIGHT_RANGE); - DEFINE_PROPERTY_REF(PROP_HAZE_KEYLIGHT_ALTITUDE, HazeKeyLightAltitude, hazeKeyLightAltitude, float, DEFAULT_HAZE_KEYLIGHT_ALTITUDE); + DEFINE_PROPERTY_REF(PROP_HAZE_KEYLIGHT_RANGE, HazeKeyLightRange, hazeKeyLightRange, float, model::initialHazeKeyLightRange_m); + DEFINE_PROPERTY_REF(PROP_HAZE_KEYLIGHT_ALTITUDE, HazeKeyLightAltitude, hazeKeyLightAltitude, float, model::initialHazeKeyLightAltitude_m); }; #endif // hifi_HazePropertyGroup_h diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index ddbb2ed914..628c228af6 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -19,6 +19,7 @@ #include "HazePropertyGroup.h" #include "StagePropertyGroup.h" #include +#include class ZoneEntityItem : public EntityItem { public: @@ -150,20 +151,20 @@ protected: uint32_t _hazeMode{ DEFAULT_HAZE_MODE }; - float _hazeRange{ HazePropertyGroup::DEFAULT_HAZE_RANGE }; - xColor _hazeColor{ HazePropertyGroup::DEFAULT_HAZE_COLOR }; - xColor _hazeGlareColor{ HazePropertyGroup::DEFAULT_HAZE_GLARE_COLOR }; + float _hazeRange{ model::initialHazeRange_m }; + xColor _hazeColor{ model::initialHazeColorXcolor }; + xColor _hazeGlareColor{ model::initialHazeGlareColorXcolor }; bool _hazeEnableGlare{ false }; - float _hazeGlareAngle{ HazePropertyGroup::DEFAULT_HAZE_GLARE_ANGLE }; + float _hazeGlareAngle{ model::initialGlareAngle_degs }; - float _hazeCeiling{ HazePropertyGroup::DEFAULT_HAZE_CEILING }; - float _hazeBaseRef{ HazePropertyGroup::DEFAULT_HAZE_BASE_REF }; + float _hazeCeiling{ model::initialHazeBaseReference_m + model::initialHazeHeight_m }; + float _hazeBaseRef{ model::initialHazeBaseReference_m }; - float _hazeBackgroundBlend{ HazePropertyGroup::DEFAULT_HAZE_BACKGROUND_BLEND }; + float _hazeBackgroundBlend{ model::initialHazeBackgroundBlend }; bool _hazeAttenuateKeyLight{ false }; - float _hazeKeyLightRange{ HazePropertyGroup::DEFAULT_HAZE_KEYLIGHT_RANGE }; - float _hazeKeyLightAltitude{ HazePropertyGroup::DEFAULT_HAZE_KEYLIGHT_ALTITUDE }; + float _hazeKeyLightRange{ model::initialHazeKeyLightRange_m }; + float _hazeKeyLightAltitude{ model::initialHazeKeyLightAltitude_m }; SkyboxPropertyGroup _skyboxProperties; HazePropertyGroup _hazeProperties; diff --git a/libraries/model/src/model/Haze.cpp b/libraries/model/src/model/Haze.cpp index 679d4ad3d1..1c9b989fd1 100644 --- a/libraries/model/src/model/Haze.cpp +++ b/libraries/model/src/model/Haze.cpp @@ -23,7 +23,7 @@ Haze::Haze() { enum HazeModes { HAZE_MODE_IS_ACTIVE = 1 << 0, HAZE_MODE_IS_ALTITUDE_BASED = 1 << 1, - HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED = 1 << 2, + HAZE_MODE_IS_KEYLIGHT_ATTENUATED = 1 << 2, HAZE_MODE_IS_MODULATE_COLOR = 1 << 3, HAZE_MODE_IS_ENABLE_LIGHT_BLEND = 1 << 4 }; @@ -55,25 +55,25 @@ void Haze::setHazeEnableGlare(const bool isHazeEnableGlare) { } } -void Haze::setDirectionalLightBlend(const float hazeDirectionalLightBlend) { +void Haze::setHazeGlareBlend(const float hazeGlareBlend) { auto& params = _hazeParametersBuffer.get(); - if (params.directionalLightBlend != hazeDirectionalLightBlend) { - _hazeParametersBuffer.edit().directionalLightBlend = hazeDirectionalLightBlend; + if (params.hazeGlareBlend != hazeGlareBlend) { + _hazeParametersBuffer.edit().hazeGlareBlend = hazeGlareBlend; } } -void Haze::setDirectionalLightColor(const glm::vec3 hazeDirectionalLightColor) { +void Haze::setHazeGlareColor(const glm::vec3 hazeGlareColor) { auto& params = _hazeParametersBuffer.get(); - if (params.directionalLightColor.r != hazeDirectionalLightColor.r) { - _hazeParametersBuffer.edit().directionalLightColor.r = hazeDirectionalLightColor.r; + if (params.hazeGlareColor.r != hazeGlareColor.r) { + _hazeParametersBuffer.edit().hazeGlareColor.r = hazeGlareColor.r; } - if (params.directionalLightColor.g != hazeDirectionalLightColor.g) { - _hazeParametersBuffer.edit().directionalLightColor.g = hazeDirectionalLightColor.g; + if (params.hazeGlareColor.g != hazeGlareColor.g) { + _hazeParametersBuffer.edit().hazeGlareColor.g = hazeGlareColor.g; } - if (params.directionalLightColor.b != hazeDirectionalLightColor.b) { - _hazeParametersBuffer.edit().directionalLightColor.b = hazeDirectionalLightColor.b; + if (params.hazeGlareColor.b != hazeGlareColor.b) { + _hazeParametersBuffer.edit().hazeGlareColor.b = hazeGlareColor.b; } } void Haze::setHazeActive(const bool isHazeActive) { @@ -99,10 +99,10 @@ void Haze::setAltitudeBased(const bool isAltitudeBased) { void Haze::setHazeAttenuateKeyLight(const bool isHazeAttenuateKeyLight) { auto& params = _hazeParametersBuffer.get(); - if (((params.hazeMode & HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) == HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED ) && !isHazeAttenuateKeyLight) { - _hazeParametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED; - } else if (((params.hazeMode & HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) != HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) && isHazeAttenuateKeyLight) { - _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED; + if (((params.hazeMode & HAZE_MODE_IS_KEYLIGHT_ATTENUATED) == HAZE_MODE_IS_KEYLIGHT_ATTENUATED) && !isHazeAttenuateKeyLight) { + _hazeParametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_KEYLIGHT_ATTENUATED; + } else if (((params.hazeMode & HAZE_MODE_IS_KEYLIGHT_ATTENUATED) != HAZE_MODE_IS_KEYLIGHT_ATTENUATED) && isHazeAttenuateKeyLight) { + _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_KEYLIGHT_ATTENUATED; } } @@ -124,11 +124,11 @@ void Haze::setHazeRangeFactor(const float hazeRangeFactor) { } } -void Haze::setHazeAltitudeFactor(const float hazeAltitudeFactor) { +void Haze::setHazeAltitudeFactor(const float hazeHeightFactor) { auto& params = _hazeParametersBuffer.get(); - if (params.hazeAltitudeFactor != hazeAltitudeFactor) { - _hazeParametersBuffer.edit().hazeAltitudeFactor = hazeAltitudeFactor; + if (params.hazeHeightFactor != hazeHeightFactor) { + _hazeParametersBuffer.edit().hazeHeightFactor = hazeHeightFactor; } } @@ -156,11 +156,11 @@ void Haze::setHazeBaseReference(const float hazeBaseReference) { } } -void Haze::setHazeBackgroundBlendValue(const float hazeBackgroundBlendValue) { +void Haze::setHazeBackgroundBlend(const float hazeBackgroundBlend) { auto& params = _hazeParametersBuffer.get(); - if (params.hazeBackgroundBlendValue != hazeBackgroundBlendValue) { - _hazeParametersBuffer.edit().hazeBackgroundBlendValue = hazeBackgroundBlendValue; + if (params.hazeBackgroundBlend != hazeBackgroundBlend) { + _hazeParametersBuffer.edit().hazeBackgroundBlend = hazeBackgroundBlend; } } diff --git a/libraries/model/src/model/Haze.h b/libraries/model/src/model/Haze.h index 2ffdd2333b..bed82c80f9 100644 --- a/libraries/model/src/model/Haze.h +++ b/libraries/model/src/model/Haze.h @@ -15,56 +15,11 @@ #include "Transform.h" #include "NumericalConstants.h" +#include "HazeInit.h" + namespace model { - const float LOG_P_005 = logf(0.05f); - const float LOG_P_05 = logf(0.5f); - - // Derivation (d is distance, b is haze coefficient, f is attenuation, solve for f = 0.05 - // f = exp(-d * b) - // ln(f) = -d * b - // b = -ln(f)/d - inline glm::vec3 convertHazeRangeToHazeRangeFactor(const glm::vec3 hazeRange_m) { - return glm::vec3( - -LOG_P_005 / hazeRange_m.x, - -LOG_P_005 / hazeRange_m.y, - -LOG_P_005 / hazeRange_m.z); - } - - // limit range and altitude to no less than 1.0 metres - inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { return -LOG_P_005 / glm::max(hazeRange_m, 1.0f); } - - inline float convertHazeAltitudeToHazeAltitudeFactor(const float hazeAltitude_m) { return -LOG_P_005 / glm::max(hazeAltitude_m, 1.0f); } - - // Derivation (s is the proportion of sun blend, a is the angle at which the blend is 50%, solve for m = 0.5 - // s = dot(lookAngle, sunAngle) = cos(a) - // m = pow(s, p) - // log(m) = p * log(s) - // p = log(m) / log(s) - inline float convertDirectionalLightAngleToPower(const float directionalLightAngle) { - return LOG_P_05 / logf(cosf(RADIANS_PER_DEGREE * directionalLightAngle)); - } - - const glm::vec3 initialHazeColor{ 0.5f, 0.6f, 0.7f }; - const float initialDirectionalLightAngle_degs{ 30.0f }; - - const glm::vec3 initialDirectionalLightColor{ 1.0f, 0.9f, 0.7f }; - const float initialHazeBaseReference{ 0.0f }; - // Haze range is defined here as the range the visibility is reduced by 95% // Haze altitude is defined here as the altitude (above 0) that the haze is reduced by 95% - const float initialHazeRange_m{ 150.0f }; - const float initialHazeAltitude_m{ 150.0f }; - - const float initialHazeKeyLightRange_m{ 150.0f }; - const float initialHazeKeyLightAltitude_m{ 150.0f }; - - const float initialHazeBackgroundBlendValue{ 0.0f }; - - const glm::vec3 initialColorModulationFactor{ - convertHazeRangeToHazeRangeFactor(initialHazeRange_m), - convertHazeRangeToHazeRangeFactor(initialHazeRange_m), - convertHazeRangeToHazeRangeFactor(initialHazeRange_m) - }; class Haze { public: @@ -73,9 +28,9 @@ namespace model { Haze(); void setHazeColor(const glm::vec3 hazeColor); - void setDirectionalLightBlend(const float directionalLightBlend); + void setHazeGlareBlend(const float hazeGlareBlend); - void setDirectionalLightColor(const glm::vec3 directionalLightColor); + void setHazeGlareColor(const glm::vec3 hazeGlareColor); void setHazeBaseReference(const float hazeBaseReference); void setHazeActive(const bool isHazeActive); @@ -90,7 +45,7 @@ namespace model { void setHazeKeyLightRangeFactor(const float hazeKeyLightRange); void setHazeKeyLightAltitudeFactor(const float hazeKeyLightAltitude); - void setHazeBackgroundBlendValue(const float hazeBackgroundBlendValue); + void setHazeBackgroundBlend(const float hazeBackgroundBlend); void setZoneTransform(const glm::mat4& zoneTransform); @@ -101,10 +56,10 @@ namespace model { public: // DO NOT CHANGE ORDER HERE WITHOUT UNDERSTANDING THE std140 LAYOUT glm::vec3 hazeColor{ initialHazeColor }; - float directionalLightBlend{ convertDirectionalLightAngleToPower(initialDirectionalLightAngle_degs) }; + float hazeGlareBlend{ convertGlareAngleToPower(initialGlareAngle_degs) }; - glm::vec3 directionalLightColor{ initialDirectionalLightColor }; - float hazeBaseReference{ initialHazeBaseReference }; + glm::vec3 hazeGlareColor{ initialHazeGlareColor }; + float hazeBaseReference{ initialHazeBaseReference_m }; glm::vec3 colorModulationFactor{ initialColorModulationFactor }; int hazeMode{ 0 }; // bit 0 - set to activate haze attenuation of fragment color @@ -115,11 +70,11 @@ namespace model { glm::mat4 zoneTransform; // Amount of background (skybox) to display, overriding the haze effect for the background - float hazeBackgroundBlendValue{ initialHazeBackgroundBlendValue }; + float hazeBackgroundBlend{ initialHazeBackgroundBlend }; // The haze attenuation exponents used by both fragment and directional light attenuation float hazeRangeFactor{ convertHazeRangeToHazeRangeFactor(initialHazeRange_m) }; - float hazeAltitudeFactor{ convertHazeAltitudeToHazeAltitudeFactor(initialHazeAltitude_m) }; + float hazeHeightFactor{ convertHazeAltitudeToHazeAltitudeFactor(initialHazeHeight_m) }; float hazeKeyLightRangeFactor{ convertHazeRangeToHazeRangeFactor(initialHazeKeyLightRange_m) }; float hazeKeyLightAltitudeFactor{ convertHazeAltitudeToHazeAltitudeFactor(initialHazeKeyLightAltitude_m) }; diff --git a/libraries/model/src/model/HazeInit.h b/libraries/model/src/model/HazeInit.h new file mode 100644 index 0000000000..218a79fc1d --- /dev/null +++ b/libraries/model/src/model/HazeInit.h @@ -0,0 +1,69 @@ +// +// MakeHaze.h +// libraries/model/src/model +// +// Created by Nissim Hadar on 10/26/2017. +// 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_model_HazeInit_h +#define hifi_model_HazeInit_h + +namespace model { + const float LOG_P_005 = logf(0.05f); + const float LOG_P_05 = logf(0.5f); + + // Derivation (d is distance, b is haze coefficient, f is attenuation, solve for f = 0.05 + // f = exp(-d * b) + // ln(f) = -d * b + // b = -ln(f)/d + inline glm::vec3 convertHazeRangeToHazeRangeFactor(const glm::vec3 hazeRange_m) { + return glm::vec3( + -LOG_P_005 / hazeRange_m.x, + -LOG_P_005 / hazeRange_m.y, + -LOG_P_005 / hazeRange_m.z); + } + + // limit range and altitude to no less than 1.0 metres + inline float convertHazeRangeToHazeRangeFactor(const float hazeRange_m) { return -LOG_P_005 / glm::max(hazeRange_m, 1.0f); } + + inline float convertHazeAltitudeToHazeAltitudeFactor(const float hazeHeight_m) { return -LOG_P_005 / glm::max(hazeHeight_m, 1.0f); } + + // Derivation (s is the proportion of sun blend, a is the angle at which the blend is 50%, solve for m = 0.5 + // s = dot(lookAngle, sunAngle) = cos(a) + // m = pow(s, p) + // log(m) = p * log(s) + // p = log(m) / log(s) + // limit to 0.1 degrees + inline float convertGlareAngleToPower(const float hazeGlareAngle) { + const float GLARE_ANGLE_LIMIT = 0.1f; + return LOG_P_05 / logf(cosf(RADIANS_PER_DEGREE * glm::max(GLARE_ANGLE_LIMIT, hazeGlareAngle))); + } + + const float initialHazeRange_m{ 1000.0f }; + const float initialHazeHeight_m{ 200.0f }; + + const float initialHazeKeyLightRange_m{ 1000.0f }; + const float initialHazeKeyLightAltitude_m{ 200.0f }; + + const float initialHazeBackgroundBlend{ 0.0f }; + + const glm::vec3 initialColorModulationFactor{ + convertHazeRangeToHazeRangeFactor(initialHazeRange_m), + convertHazeRangeToHazeRangeFactor(initialHazeRange_m), + convertHazeRangeToHazeRangeFactor(initialHazeRange_m) + }; + + const glm::vec3 initialHazeColor{ 0.5f, 0.6f, 0.7f }; // Bluish + const xColor initialHazeColorXcolor{ 128, 154, 179 }; + + const float initialGlareAngle_degs{ 20.0f }; + + const glm::vec3 initialHazeGlareColor{ 1.0f, 0.9f, 0.7f }; + const xColor initialHazeGlareColorXcolor{ 255, 229, 179 }; + + const float initialHazeBaseReference_m{ 0.0f }; +} +#endif // hifi_model_HazeInit_h diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index cc20f6335e..f70daf1e77 100644 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -134,7 +134,7 @@ vec3 evalSkyboxGlobalColor(mat4 invViewMat, float shadowAttenuation, float obscu color += directionalSpecular; // Attenuate the light if haze effect selected - if ((hazeParams.hazeMode & HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) == HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) { + if ((hazeParams.hazeMode & HAZE_MODE_IS_KEYLIGHT_ATTENUATED) == HAZE_MODE_IS_KEYLIGHT_ATTENUATED) { // Directional light attenuation is simulated by assuming the light source is at a fixed height above the // fragment. This height is where the haze density is reduced by 95% from the haze at the fragment's height // @@ -147,8 +147,8 @@ vec3 evalSkyboxGlobalColor(mat4 invViewMat, float shadowAttenuation, float obscu // Height at which haze density is reduced by 95% (default set to 2000.0 for safety ,this should never happen) float height_95p = 2000.0; - if (hazeParams.hazeAltitudeFactorKeyLight > 0.0f) { - height_95p = -log(0.05) / hazeParams.hazeAltitudeFactorKeyLight; + if (hazeParams.hazeKeyLightAltitudeFactor > 0.0f) { + height_95p = -log(0.05) / hazeParams.hazeKeyLightAltitudeFactor; } // Note that the sine will always be positive @@ -168,8 +168,8 @@ vec3 evalSkyboxGlobalColor(mat4 invViewMat, float shadowAttenuation, float obscu // Integration is from the fragment towards the light source // Note that the haze base reference affects only the haze density as function of altitude float hazeDensityDistribution = - hazeParams.hazeRangeFactorKeyLight * - exp(-hazeParams.hazeAltitudeFactorKeyLight * (worldFragPos.y - hazeParams.hazeBaseReference)); + hazeParams.hazeKeyLightRangeFactor * + exp(-hazeParams.hazeKeyLightAltitudeFactor * (worldFragPos.y - hazeParams.hazeBaseReference)); float hazeIntegral = hazeDensityDistribution * distance; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index b6a91888a1..e6a33a9911 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -498,7 +498,7 @@ void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, auto lightStage = renderContext->_scene->getStage(); assert(lightStage); assert(lightStage->getNumLights() > 0); - auto lightAndShadow = lightStage->getCurrentKeyLightAndShadow(); + auto lightAndShadow = lightStage->getLightAndShadow(0); const auto& globalShadow = lightAndShadow.second; // Bind the shadow buffer @@ -509,7 +509,7 @@ void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, auto& program = deferredLightingEffect->_directionalSkyboxLight; LightLocationsPtr locations = deferredLightingEffect->_directionalSkyboxLightLocations; - auto keyLight = lightAndShadow.first; + auto keyLight = lightStage->getLight(0); // Setup the global directional pass pipeline { diff --git a/libraries/render-utils/src/DrawHaze.cpp b/libraries/render-utils/src/DrawHaze.cpp index bf254ce80e..071db8cf25 100644 --- a/libraries/render-utils/src/DrawHaze.cpp +++ b/libraries/render-utils/src/DrawHaze.cpp @@ -33,24 +33,24 @@ void HazeConfig::setHazeColorB(const float value) { hazeColorB = value; } -void HazeConfig::setDirectionalLightAngle_degs(const float value) { - hazeDirectionalLightAngle_degs = value; +void HazeConfig::setHazeGlareAngle_degs(const float value) { + hazeGlareAngle_degs = value; } -void HazeConfig::setDirectionalLightColorR(const float value) { - hazeDirectionalLightColorR = value; +void HazeConfig::setHazeGlareColorR(const float value) { + hazeGlareColorR = value; } -void HazeConfig::setDirectionalLightColorG(const float value) { - hazeDirectionalLightColorG = value; +void HazeConfig::setHazeGlareColorG(const float value) { + hazeGlareColorG = value; } -void HazeConfig::setDirectionalLightColorB(const float value) { - hazeDirectionalLightColorB = value; +void HazeConfig::setHazeGlareColorB(const float value) { + hazeGlareColorB = value; } void HazeConfig::setHazeBaseReference(const float value) { - hazeBaseReference = value; + hazeBaseReference_m = value; } void HazeConfig::setHazeActive(const bool active) { @@ -78,7 +78,7 @@ void HazeConfig::setHazeRange_m(const float value) { } void HazeConfig::setHazeAltitude_m(const float value) { - hazeAltitude_m = value; + hazeHeight_m = value; } void HazeConfig::setHazeKeyLightRange_m(const float value) { @@ -89,8 +89,8 @@ void HazeConfig::setHazeKeyLightAltitude_m(const float value) { hazeKeyLightAltitude_m = value; } -void HazeConfig::setHazeBackgroundBlendValue(const float value) { - hazeBackgroundBlendValue = value; +void HazeConfig::setHazeBackgroundBlend(const float value) { + hazeBackgroundBlend = value; } MakeHaze::MakeHaze() { @@ -99,10 +99,10 @@ MakeHaze::MakeHaze() { void MakeHaze::configure(const Config& config) { _haze->setHazeColor(glm::vec3(config.hazeColorR, config.hazeColorG, config.hazeColorB)); - _haze->setDirectionalLightBlend(model::convertDirectionalLightAngleToPower(config.hazeDirectionalLightAngle_degs)); + _haze->setHazeGlareBlend(model::convertGlareAngleToPower(config.hazeGlareAngle_degs)); - _haze->setDirectionalLightColor(glm::vec3(config.hazeDirectionalLightColorR, config.hazeDirectionalLightColorG, config.hazeDirectionalLightColorB)); - _haze->setHazeBaseReference(config.hazeBaseReference); + _haze->setHazeGlareColor(glm::vec3(config.hazeGlareColorR, config.hazeGlareColorG, config.hazeGlareColorB)); + _haze->setHazeBaseReference(config.hazeBaseReference_m); _haze->setHazeActive(config.isHazeActive); _haze->setAltitudeBased(config.isAltitudeBased); @@ -111,12 +111,12 @@ void MakeHaze::configure(const Config& config) { _haze->setHazeEnableGlare(config.isHazeEnableGlare); _haze->setHazeRangeFactor(model::convertHazeRangeToHazeRangeFactor(config.hazeRange_m)); - _haze->setHazeAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeAltitude_m)); + _haze->setHazeAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeHeight_m)); _haze->setHazeKeyLightRangeFactor(model::convertHazeRangeToHazeRangeFactor(config.hazeKeyLightRange_m)); _haze->setHazeKeyLightAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeKeyLightAltitude_m)); - _haze->setHazeBackgroundBlendValue(config.hazeBackgroundBlendValue); + _haze->setHazeBackgroundBlend(config.hazeBackgroundBlend); } void MakeHaze::run(const render::RenderContextPointer& renderContext, model::HazePointer& haze) { diff --git a/libraries/render-utils/src/DrawHaze.h b/libraries/render-utils/src/DrawHaze.h index 4a7b2135bd..e7a3f2c636 100644 --- a/libraries/render-utils/src/DrawHaze.h +++ b/libraries/render-utils/src/DrawHaze.h @@ -22,7 +22,7 @@ #include "SurfaceGeometryPass.h" -#include "model/Haze.h" +#include using LinearDepthFramebufferPointer = std::shared_ptr; @@ -32,12 +32,12 @@ class MakeHazeConfig : public render::Job::Config { Q_PROPERTY(float hazeColorR MEMBER hazeColorR WRITE setHazeColorR NOTIFY dirty); Q_PROPERTY(float hazeColorG MEMBER hazeColorG WRITE setHazeColorG NOTIFY dirty); Q_PROPERTY(float hazeColorB MEMBER hazeColorB WRITE setHazeColorB NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightAngle_degs MEMBER hazeDirectionalLightAngle_degs WRITE setDirectionalLightAngle_degs NOTIFY dirty); + Q_PROPERTY(float hazeGlareAngle_degs MEMBER hazeGlareAngle_degs WRITE setHazeGlareAngle_degs NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorR MEMBER hazeDirectionalLightColorR WRITE setDirectionalLightColorR NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorG MEMBER hazeDirectionalLightColorG WRITE setDirectionalLightColorG NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorB MEMBER hazeDirectionalLightColorB WRITE setDirectionalLightColorB NOTIFY dirty); - Q_PROPERTY(float hazeBaseReference MEMBER hazeBaseReference WRITE setHazeBaseReference NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorR MEMBER hazeGlareColorR WRITE setHazeGlareColorR NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorG MEMBER hazeGlareColorG WRITE setHazeGlareColorG NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorB MEMBER hazeGlareColorB WRITE setHazeGlareColorB NOTIFY dirty); + Q_PROPERTY(float hazeBaseReference_m MEMBER hazeBaseReference_m WRITE setHazeBaseReference NOTIFY dirty); Q_PROPERTY(bool isHazeActive MEMBER isHazeActive WRITE setHazeActive NOTIFY dirty); Q_PROPERTY(bool isAltitudeBased MEMBER isAltitudeBased WRITE setAltitudeBased NOTIFY dirty); @@ -46,12 +46,12 @@ class MakeHazeConfig : public render::Job::Config { Q_PROPERTY(bool isHazeEnableGlare MEMBER isHazeEnableGlare WRITE setHazeEnableGlare NOTIFY dirty); Q_PROPERTY(float hazeRange_m MEMBER hazeRange_m WRITE setHazeRange_m NOTIFY dirty); - Q_PROPERTY(float hazeAltitude_m MEMBER hazeAltitude_m WRITE setHazeAltitude_m NOTIFY dirty); + Q_PROPERTY(float hazeHeight_m MEMBER hazeHeight_m WRITE setHazeAltitude_m NOTIFY dirty); Q_PROPERTY(float hazeKeyLightRange_m MEMBER hazeKeyLightRange_m WRITE setHazeKeyLightRange_m NOTIFY dirty); Q_PROPERTY(float hazeKeyLightAltitude_m MEMBER hazeKeyLightAltitude_m WRITE setHazeKeyLightAltitude_m NOTIFY dirty); - Q_PROPERTY(float hazeBackgroundBlendValue MEMBER hazeBackgroundBlendValue WRITE setHazeBackgroundBlendValue NOTIFY dirty); + Q_PROPERTY(float hazeBackgroundBlend MEMBER hazeBackgroundBlend WRITE setHazeBackgroundBlend NOTIFY dirty); public: MakeHazeConfig() : render::Job::Config() {} @@ -59,12 +59,12 @@ public: float hazeColorR{ model::initialHazeColor.r }; float hazeColorG{ model::initialHazeColor.g }; float hazeColorB{ model::initialHazeColor.b }; - float hazeDirectionalLightAngle_degs{ model::initialDirectionalLightAngle_degs }; + float hazeGlareAngle_degs{ model::initialGlareAngle_degs }; - float hazeDirectionalLightColorR{ model::initialDirectionalLightColor.r }; - float hazeDirectionalLightColorG{ model::initialDirectionalLightColor.g }; - float hazeDirectionalLightColorB{ model::initialDirectionalLightColor.b }; - float hazeBaseReference{ model::initialHazeBaseReference }; + float hazeGlareColorR{ model::initialHazeGlareColor.r }; + float hazeGlareColorG{ model::initialHazeGlareColor.g }; + float hazeGlareColorB{ model::initialHazeGlareColor.b }; + float hazeBaseReference_m{ model::initialHazeBaseReference_m }; bool isHazeActive{ false }; bool isAltitudeBased{ false }; @@ -73,23 +73,23 @@ public: bool isHazeEnableGlare{ false }; float hazeRange_m{ model::initialHazeRange_m }; - float hazeAltitude_m{ model::initialHazeAltitude_m }; + float hazeHeight_m{ model::initialHazeHeight_m }; float hazeKeyLightRange_m{ model::initialHazeKeyLightRange_m }; float hazeKeyLightAltitude_m{ model::initialHazeKeyLightAltitude_m }; - float hazeBackgroundBlendValue{ model::initialHazeBackgroundBlendValue }; + float hazeBackgroundBlend{ model::initialHazeBackgroundBlend }; public slots: void setHazeColorR(const float value) { hazeColorR = value; emit dirty(); } void setHazeColorG(const float value) { hazeColorG = value; emit dirty(); } void setHazeColorB(const float value) { hazeColorB = value; emit dirty(); } - void setDirectionalLightAngle_degs(const float value) { hazeDirectionalLightAngle_degs = value; emit dirty(); } + void setHazeGlareAngle_degs(const float value) { hazeGlareAngle_degs = value; emit dirty(); } - void setDirectionalLightColorR(const float value) { hazeDirectionalLightColorR = value; emit dirty(); } - void setDirectionalLightColorG(const float value) { hazeDirectionalLightColorG = value; emit dirty(); } - void setDirectionalLightColorB(const float value) { hazeDirectionalLightColorB = value; emit dirty(); } - void setHazeBaseReference(const float value) { hazeBaseReference = value; ; emit dirty(); } + void setHazeGlareColorR(const float value) { hazeGlareColorR = value; emit dirty(); } + void setHazeGlareColorG(const float value) { hazeGlareColorG = value; emit dirty(); } + void setHazeGlareColorB(const float value) { hazeGlareColorB = value; emit dirty(); } + void setHazeBaseReference(const float value) { hazeBaseReference_m = value; ; emit dirty(); } void setHazeActive(const bool active) { isHazeActive = active; emit dirty(); } void setAltitudeBased(const bool active) { isAltitudeBased = active; emit dirty(); } @@ -98,12 +98,12 @@ public slots: void setHazeEnableGlare(const bool active) { isHazeEnableGlare = active; emit dirty(); } void setHazeRange_m(const float value) { hazeRange_m = value; emit dirty(); } - void setHazeAltitude_m(const float value) { hazeAltitude_m = value; emit dirty(); } + void setHazeAltitude_m(const float value) { hazeHeight_m = value; emit dirty(); } void setHazeKeyLightRange_m(const float value) { hazeKeyLightRange_m = value; emit dirty(); } void setHazeKeyLightAltitude_m(const float value) { hazeKeyLightAltitude_m = value; emit dirty(); } - void setHazeBackgroundBlendValue(const float value) { hazeBackgroundBlendValue = value; ; emit dirty(); } + void setHazeBackgroundBlend(const float value) { hazeBackgroundBlend = value; ; emit dirty(); } signals: void dirty(); @@ -131,12 +131,12 @@ public: float hazeColorR{ model::initialHazeColor.r }; float hazeColorG{ model::initialHazeColor.g }; float hazeColorB{ model::initialHazeColor.b }; - float hazeDirectionalLightAngle_degs{ model::initialDirectionalLightAngle_degs }; + float hazeGlareAngle_degs{ model::initialGlareAngle_degs }; - float hazeDirectionalLightColorR{ model::initialDirectionalLightColor.r }; - float hazeDirectionalLightColorG{ model::initialDirectionalLightColor.g }; - float hazeDirectionalLightColorB{ model::initialDirectionalLightColor.b }; - float hazeBaseReference{ model::initialHazeBaseReference }; + float hazeGlareColorR{ model::initialHazeGlareColor.r }; + float hazeGlareColorG{ model::initialHazeGlareColor.g }; + float hazeGlareColorB{ model::initialHazeGlareColor.b }; + float hazeBaseReference_m{ model::initialHazeBaseReference_m }; bool isHazeActive{ false }; // Setting this to true will set haze to on bool isAltitudeBased{ false }; @@ -145,22 +145,22 @@ public: bool isHazeEnableGlare{ false }; float hazeRange_m{ model::initialHazeRange_m }; - float hazeAltitude_m{ model::initialHazeAltitude_m }; + float hazeHeight_m{ model::initialHazeHeight_m }; float hazeKeyLightRange_m{ model::initialHazeKeyLightRange_m }; float hazeKeyLightAltitude_m{ model::initialHazeKeyLightAltitude_m }; - float hazeBackgroundBlendValue{ model::initialHazeBackgroundBlendValue }; + float hazeBackgroundBlend{ model::initialHazeBackgroundBlend }; // methods void setHazeColorR(const float value); void setHazeColorG(const float value); void setHazeColorB(const float value); - void setDirectionalLightAngle_degs(const float value); + void setHazeGlareAngle_degs(const float value); - void setDirectionalLightColorR(const float value); - void setDirectionalLightColorG(const float value); - void setDirectionalLightColorB(const float value); + void setHazeGlareColorR(const float value); + void setHazeGlareColorG(const float value); + void setHazeGlareColorB(const float value); void setHazeBaseReference(const float value); void setHazeActive(const bool active); @@ -175,7 +175,7 @@ public: void setHazeKeyLightRange_m(const float value); void setHazeKeyLightAltitude_m(const float value); - void setHazeBackgroundBlendValue(const float value); + void setHazeBackgroundBlend(const float value); }; class DrawHaze { diff --git a/libraries/render-utils/src/Haze.slf b/libraries/render-utils/src/Haze.slf index 77c820e093..b366e6d639 100644 --- a/libraries/render-utils/src/Haze.slf +++ b/libraries/render-utils/src/Haze.slf @@ -60,15 +60,15 @@ void main(void) { Light light = getLight(); vec3 lightDirection = getLightDirection(light); - float directionalLightComponent = max(0.0, dot(eyeFragDir, -lightDirection)); - float power = min(1.0, pow(directionalLightComponent, hazeParams.directionalLightBlend)); + float glareComponent = max(0.0, dot(eyeFragDir, -lightDirection)); + float power = min(1.0, pow(glareComponent, hazeParams.hazeGlareBlend)); - vec4 directionalLightColor = vec4(hazeParams.directionalLightColor, 1.0); + vec4 glareColor = vec4(hazeParams.hazeGlareColor, 1.0); - // Use the haze colour for the belnd-out colour, if blend is not enabled + // Use the haze colour for the glare colour, if blend is not enabled vec4 blendedHazeColor; if ((hazeParams.hazeMode & HAZE_MODE_IS_ENABLE_LIGHT_BLEND) == HAZE_MODE_IS_ENABLE_LIGHT_BLEND) { - blendedHazeColor = mix(hazeColor, directionalLightColor, power); + blendedHazeColor = mix(hazeColor, glareColor, power); } else { blendedHazeColor = hazeColor; } @@ -86,14 +86,14 @@ void main(void) { // Note that the haze base reference affects only the haze density as function of altitude vec3 hazeDensityDistribution = hazeParams.colorModulationFactor * - exp(-hazeParams.hazeAltitudeFactor * (worldEyePos.y - hazeParams.hazeBaseReference)); + exp(-hazeParams.hazeHeightFactor * (worldEyePos.y - hazeParams.hazeBaseReference)); vec3 hazeIntegral = hazeDensityDistribution * distance; const float slopeThreshold = 0.01; float deltaHeight = worldFragPos.y - worldEyePos.y; if (abs(deltaHeight) > slopeThreshold) { - float t = hazeParams.hazeAltitudeFactor * deltaHeight; + float t = hazeParams.hazeHeightFactor * deltaHeight; hazeIntegral *= (1.0 - exp (-t)) / t; } @@ -117,14 +117,14 @@ void main(void) { // Note that the haze base reference affects only the haze density as function of altitude float hazeDensityDistribution = hazeParams.hazeRangeFactor * - exp(-hazeParams.hazeAltitudeFactor * (worldEyePos.y - hazeParams.hazeBaseReference)); + exp(-hazeParams.hazeHeightFactor * (worldEyePos.y - hazeParams.hazeBaseReference)); float hazeIntegral = hazeDensityDistribution * distance; const float slopeThreshold = 0.01; float deltaHeight = worldFragPos.y - worldEyePos.y; if (abs(deltaHeight) > slopeThreshold) { - float t = hazeParams.hazeAltitudeFactor * deltaHeight; + float t = hazeParams.hazeHeightFactor * deltaHeight; // Protect from wild values if (abs(t) > 0.0000001) { hazeIntegral *= (1.0 - exp (-t)) / t; @@ -140,7 +140,7 @@ void main(void) { // Mix with background at far range const float BLEND_DISTANCE = 27000.0; if (distance > BLEND_DISTANCE) { - outFragColor = mix(potentialFragColor, fragColor, hazeParams.backgroundBlendValue); + outFragColor = mix(potentialFragColor, fragColor, hazeParams.backgroundBlend); } else { outFragColor = potentialFragColor; } diff --git a/libraries/render-utils/src/Haze.slh b/libraries/render-utils/src/Haze.slh index 614431dce7..de7f0ac246 100644 --- a/libraries/render-utils/src/Haze.slh +++ b/libraries/render-utils/src/Haze.slh @@ -12,28 +12,28 @@ const int HAZE_MODE_IS_ACTIVE = 1 << 0; const int HAZE_MODE_IS_ALTITUDE_BASED = 1 << 1; -const int HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED = 1 << 2; +const int HAZE_MODE_IS_KEYLIGHT_ATTENUATED = 1 << 2; const int HAZE_MODE_IS_MODULATE_COLOR = 1 << 3; const int HAZE_MODE_IS_ENABLE_LIGHT_BLEND = 1 << 4; struct HazeParams { vec3 hazeColor; - float directionalLightBlend; + float hazeGlareBlend; - vec3 directionalLightColor; + vec3 hazeGlareColor; float hazeBaseReference; vec3 colorModulationFactor; int hazeMode; mat4 zoneTransform; - float backgroundBlendValue; + float backgroundBlend; float hazeRangeFactor; - float hazeAltitudeFactor; + float hazeHeightFactor; - float hazeRangeFactorKeyLight; - float hazeAltitudeFactorKeyLight; + float hazeKeyLightRangeFactor; + float hazeKeyLightAltitudeFactor; }; layout(std140) uniform hazeBuffer { diff --git a/libraries/render-utils/src/HazeStage.cpp b/libraries/render-utils/src/HazeStage.cpp index aa7a7f554c..6a6104a1df 100644 --- a/libraries/render-utils/src/HazeStage.cpp +++ b/libraries/render-utils/src/HazeStage.cpp @@ -21,10 +21,10 @@ FetchHazeStage::FetchHazeStage() { void FetchHazeStage::configure(const Config& config) { _haze->setHazeColor(glm::vec3(config.hazeColorR, config.hazeColorG, config.hazeColorB)); - _haze->setDirectionalLightBlend(model::convertDirectionalLightAngleToPower(config.hazeDirectionalLightAngle_degs)); + _haze->setHazeGlareBlend(model::convertGlareAngleToPower(config.hazeGlareAngle_degs)); - _haze->setDirectionalLightColor(glm::vec3(config.hazeDirectionalLightColorR, config.hazeDirectionalLightColorG, config.hazeDirectionalLightColorB)); - _haze->setHazeBaseReference(config.hazeBaseReference); + _haze->setHazeGlareColor(glm::vec3(config.hazeGlareColorR, config.hazeGlareColorG, config.hazeGlareColorB)); + _haze->setHazeBaseReference(config.hazeBaseReference_m); _haze->setHazeActive(config.isHazeActive); _haze->setAltitudeBased(config.isAltitudeBased); @@ -33,12 +33,12 @@ void FetchHazeStage::configure(const Config& config) { _haze->setHazeEnableGlare(config.isHazeEnableGlare); _haze->setHazeRangeFactor(model::convertHazeRangeToHazeRangeFactor(config.hazeRange_m)); - _haze->setHazeAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeAltitude_m)); + _haze->setHazeAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeHeight_m)); _haze->setHazeKeyLightRangeFactor(model::convertHazeRangeToHazeRangeFactor(config.hazeKeyLightRange_m)); _haze->setHazeKeyLightAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(config.hazeKeyLightAltitude_m)); - _haze->setHazeBackgroundBlendValue(config.hazeBackgroundBlendValue); + _haze->setHazeBackgroundBlend(config.hazeBackgroundBlend); } HazeStage::Index HazeStage::findHaze(const HazePointer& haze) const { diff --git a/libraries/render-utils/src/HazeStage.h b/libraries/render-utils/src/HazeStage.h index 7cc0c659b0..e2d09f3011 100644 --- a/libraries/render-utils/src/HazeStage.h +++ b/libraries/render-utils/src/HazeStage.h @@ -19,7 +19,7 @@ #include #include -#include "model/Haze.h" +#include // Haze stage to set up haze-related rendering tasks class HazeStage : public render::Stage { @@ -86,12 +86,12 @@ class FetchHazeConfig : public render::Job::Config { Q_PROPERTY(float hazeColorR MEMBER hazeColorR WRITE setHazeColorR NOTIFY dirty); Q_PROPERTY(float hazeColorG MEMBER hazeColorG WRITE setHazeColorG NOTIFY dirty); Q_PROPERTY(float hazeColorB MEMBER hazeColorB WRITE setHazeColorB NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightAngle_degs MEMBER hazeDirectionalLightAngle_degs WRITE setDirectionalLightAngle_degs NOTIFY dirty); + Q_PROPERTY(float hazeGlareAngle_degs MEMBER hazeGlareAngle_degs WRITE setHazeGlareAngle_degs NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorR MEMBER hazeDirectionalLightColorR WRITE setDirectionalLightColorR NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorG MEMBER hazeDirectionalLightColorG WRITE setDirectionalLightColorG NOTIFY dirty); - Q_PROPERTY(float hazeDirectionalLightColorB MEMBER hazeDirectionalLightColorB WRITE setDirectionalLightColorB NOTIFY dirty); - Q_PROPERTY(float hazeBaseReference MEMBER hazeBaseReference WRITE setHazeBaseReference NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorR MEMBER hazeGlareColorR WRITE setHazeGlareColorR NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorG MEMBER hazeGlareColorG WRITE setHazeGlareColorG NOTIFY dirty); + Q_PROPERTY(float hazeGlareColorB MEMBER hazeGlareColorB WRITE setHazeGlareColorB NOTIFY dirty); + Q_PROPERTY(float hazeBaseReference_m MEMBER hazeBaseReference_m WRITE setHazeBaseReference NOTIFY dirty); Q_PROPERTY(bool isHazeActive MEMBER isHazeActive WRITE setHazeActive NOTIFY dirty); Q_PROPERTY(bool isAltitudeBased MEMBER isAltitudeBased WRITE setAltitudeBased NOTIFY dirty); @@ -100,12 +100,12 @@ class FetchHazeConfig : public render::Job::Config { Q_PROPERTY(bool isHazeEnableGlare MEMBER isHazeEnableGlare WRITE setHazeEnableGlare NOTIFY dirty); Q_PROPERTY(float hazeRange_m MEMBER hazeRange_m WRITE setHazeRange_m NOTIFY dirty); - Q_PROPERTY(float hazeAltitude_m MEMBER hazeAltitude_m WRITE setHazeAltitude_m NOTIFY dirty); + Q_PROPERTY(float hazeHeight_m MEMBER hazeHeight_m WRITE setHazeAltitude_m NOTIFY dirty); Q_PROPERTY(float hazeKeyLightRange_m MEMBER hazeKeyLightRange_m WRITE setHazeKeyLightRange_m NOTIFY dirty); Q_PROPERTY(float hazeKeyLightAltitude_m MEMBER hazeKeyLightAltitude_m WRITE setHazeKeyLightAltitude_m NOTIFY dirty); - Q_PROPERTY(float hazeBackgroundBlendValue MEMBER hazeBackgroundBlendValue WRITE setHazeBackgroundBlendValue NOTIFY dirty); + Q_PROPERTY(float hazeBackgroundBlend MEMBER hazeBackgroundBlend WRITE setHazeBackgroundBlend NOTIFY dirty); public: FetchHazeConfig() : render::Job::Config() {} @@ -113,12 +113,12 @@ public: float hazeColorR{ model::initialHazeColor.r }; float hazeColorG{ model::initialHazeColor.g }; float hazeColorB{ model::initialHazeColor.b }; - float hazeDirectionalLightAngle_degs{ model::initialDirectionalLightAngle_degs }; + float hazeGlareAngle_degs{ model::initialGlareAngle_degs }; - float hazeDirectionalLightColorR{ model::initialDirectionalLightColor.r }; - float hazeDirectionalLightColorG{ model::initialDirectionalLightColor.g }; - float hazeDirectionalLightColorB{ model::initialDirectionalLightColor.b }; - float hazeBaseReference{ model::initialHazeBaseReference }; + float hazeGlareColorR{ model::initialHazeGlareColor.r }; + float hazeGlareColorG{ model::initialHazeGlareColor.g }; + float hazeGlareColorB{ model::initialHazeGlareColor.b }; + float hazeBaseReference_m{ model::initialHazeBaseReference_m }; bool isHazeActive{ false }; bool isAltitudeBased{ false }; @@ -127,23 +127,23 @@ public: bool isHazeEnableGlare{ false }; float hazeRange_m{ model::initialHazeRange_m }; - float hazeAltitude_m{ model::initialHazeAltitude_m }; + float hazeHeight_m{ model::initialHazeHeight_m }; float hazeKeyLightRange_m{ model::initialHazeKeyLightRange_m }; float hazeKeyLightAltitude_m{ model::initialHazeKeyLightAltitude_m }; - float hazeBackgroundBlendValue{ model::initialHazeBackgroundBlendValue }; + float hazeBackgroundBlend{ model::initialHazeBackgroundBlend }; public slots: void setHazeColorR(const float value) { hazeColorR = value; emit dirty(); } void setHazeColorG(const float value) { hazeColorG = value; emit dirty(); } void setHazeColorB(const float value) { hazeColorB = value; emit dirty(); } - void setDirectionalLightAngle_degs(const float value) { hazeDirectionalLightAngle_degs = value; emit dirty(); } + void setHazeGlareAngle_degs(const float value) { hazeGlareAngle_degs = value; emit dirty(); } - void setDirectionalLightColorR(const float value) { hazeDirectionalLightColorR = value; emit dirty(); } - void setDirectionalLightColorG(const float value) { hazeDirectionalLightColorG = value; emit dirty(); } - void setDirectionalLightColorB(const float value) { hazeDirectionalLightColorB = value; emit dirty(); } - void setHazeBaseReference(const float value) { hazeBaseReference = value; ; emit dirty(); } + void setHazeGlareColorR(const float value) { hazeGlareColorR = value; emit dirty(); } + void setHazeGlareColorG(const float value) { hazeGlareColorG = value; emit dirty(); } + void setHazeGlareColorB(const float value) { hazeGlareColorB = value; emit dirty(); } + void setHazeBaseReference(const float value) { hazeBaseReference_m = value; ; emit dirty(); } void setHazeActive(const bool active) { isHazeActive = active; emit dirty(); } void setAltitudeBased(const bool active) { isAltitudeBased = active; emit dirty(); } @@ -152,12 +152,12 @@ public slots: void setHazeEnableGlare(const bool active) { isHazeEnableGlare = active; emit dirty(); } void setHazeRange_m(const float value) { hazeRange_m = value; emit dirty(); } - void setHazeAltitude_m(const float value) { hazeAltitude_m = value; emit dirty(); } + void setHazeAltitude_m(const float value) { hazeHeight_m = value; emit dirty(); } void setHazeKeyLightRange_m(const float value) { hazeKeyLightRange_m = value; emit dirty(); } void setHazeKeyLightAltitude_m(const float value) { hazeKeyLightAltitude_m = value; emit dirty(); } - void setHazeBackgroundBlendValue(const float value) { hazeBackgroundBlendValue = value; ; emit dirty(); } + void setHazeBackgroundBlend(const float value) { hazeBackgroundBlend = value; ; emit dirty(); } signals: void dirty(); diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 2d5dd35e66..f898eb3b9a 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -570,14 +570,14 @@
-
+
Haze Color
-
+
-
+
-
+
@@ -586,14 +586,14 @@
-
+
Glare Color
-
+
-
+
-
+
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index a015eed714..0463ac4172 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -678,14 +678,14 @@ function loaded() { var elZoneHazeModeEnabled = document.getElementById("property-zone-haze-mode-enabled"); var elZoneHazeRange = document.getElementById("property-zone-haze-range"); - var elZoneHazeColor = document.getElementById("property-zone-haze-blend-in-color"); - var elZoneHazeColorRed = document.getElementById("property-zone-haze-blend-in-color-red"); - var elZoneHazeColorGreen = document.getElementById("property-zone-haze-blend-in-color-green"); - var elZoneHazeColorBlue = document.getElementById("property-zone-haze-blend-in-color-blue"); - var elZoneHazeGlareColor = document.getElementById("property-zone-haze-blend-out-color"); - var elZoneHazeGlareColorRed = document.getElementById("property-zone-haze-blend-out-color-red"); - var elZoneHazeGlareColorGreen = document.getElementById("property-zone-haze-blend-out-color-green"); - var elZoneHazeGlareColorBlue = document.getElementById("property-zone-haze-blend-out-color-blue"); + var elZoneHazeColor = document.getElementById("property-zone-haze-color"); + var elZoneHazeColorRed = document.getElementById("property-zone-haze-color-red"); + var elZoneHazeColorGreen = document.getElementById("property-zone-haze-color-green"); + var elZoneHazeColorBlue = document.getElementById("property-zone-haze-color-blue"); + var elZoneHazeGlareColor = document.getElementById("property-zone-haze-glare-color"); + var elZoneHazeGlareColorRed = document.getElementById("property-zone-haze-glare-color-red"); + var elZoneHazeGlareColorGreen = document.getElementById("property-zone-haze-glare-color-green"); + var elZoneHazeGlareColorBlue = document.getElementById("property-zone-haze-glare-color-blue"); var elZoneHazeEnableGlare = document.getElementById("property-zone-haze-enable-light-blend"); var elZonehazeGlareAngle = document.getElementById("property-zone-haze-blend-angle"); @@ -1474,15 +1474,15 @@ function loaded() { elZoneHazeRange.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('haze', 'hazeRange')); - colorPickers.push($('#property-zone-haze-blend-in-color').colpick({ + colorPickers.push($('#property-zone-haze-color').colpick({ colorScheme: 'dark', layout: 'hex', color: '000000', onShow: function(colpick) { - $('#property-zone-haze-blend-in-color').attr('active', 'true'); + $('#property-zone-haze-color').attr('active', 'true'); }, onHide: function(colpick) { - $('#property-zone-haze-blend-in-color').attr('active', 'false'); + $('#property-zone-haze-color').attr('active', 'false'); }, onSubmit: function(hsb, hex, rgb, el) { $(el).css('background-color', '#' + hex); @@ -1499,15 +1499,15 @@ function loaded() { elZoneHazeColorGreen.addEventListener('change', zoneHazeColorChangeFunction); elZoneHazeColorBlue.addEventListener('change', zoneHazeColorChangeFunction); - colorPickers.push($('#property-zone-haze-blend-out-color').colpick({ + colorPickers.push($('#property-zone-haze-glare-color').colpick({ colorScheme: 'dark', layout: 'hex', color: '000000', onShow: function(colpick) { - $('#property-zone-haze-blend-out-color').attr('active', 'true'); + $('#property-zone-haze-glare-color').attr('active', 'true'); }, onHide: function(colpick) { - $('#property-zone-haze-blend-out-color').attr('active', 'false'); + $('#property-zone-haze-glare-color').attr('active', 'false'); }, onSubmit: function(hsb, hex, rgb, el) { $(el).css('background-color', '#' + hex); From 2c4d4373dc87d4a76030c3690180c712d266936d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 27 Oct 2017 10:41:16 -0700 Subject: [PATCH 13/39] support asymmetrical cross section Cylinder --- libraries/entities/src/ShapeEntityItem.cpp | 37 ++++++++++++++-------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index 8c7d1576e1..4115a606df 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -51,12 +51,12 @@ namespace entity { } } -// shapeCalculator is a hook for external code that knows how to configure a ShapeInfo +// hullShapeCalculator is a hook for external code that knows how to configure a ShapeInfo // for given entity::Shape and dimensions -ShapeEntityItem::ShapeInfoCalculator shapeCalculator = nullptr; +ShapeEntityItem::ShapeInfoCalculator hullShapeCalculator = nullptr; void ShapeEntityItem::setShapeInfoCalulator(ShapeEntityItem::ShapeInfoCalculator callback) { - shapeCalculator = callback; + hullShapeCalculator = callback; } ShapeEntityItem::Pointer ShapeEntityItem::baseFactory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -276,7 +276,6 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { } break; case entity::Shape::Sphere: { - float diameter = entityDimensions.x; const float MIN_DIAMETER = 0.001f; const float MIN_RELATIVE_SPHERICAL_ERROR = 0.001f; @@ -293,13 +292,25 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { case entity::Shape::Circle: // Circles collide like flat Cylinders case entity::Shape::Cylinder: { - _collisionShapeType = SHAPE_TYPE_CYLINDER_Y; + float diameter = entityDimensions.x; + const float MIN_DIAMETER = 0.001f; + const float MIN_RELATIVE_SPHERICAL_ERROR = 0.001f; + if (diameter > MIN_DIAMETER + && fabsf(diameter - entityDimensions.z) / diameter < MIN_RELATIVE_SPHERICAL_ERROR) { + _collisionShapeType = SHAPE_TYPE_SPHERE; + } else if (hullShapeCalculator) { + hullShapeCalculator(this, info); + _collisionShapeType = SHAPE_TYPE_SIMPLE_HULL; + } else { + // woops, someone forgot to hook up the hullShapeCalculator()! + // final fallback is ellipsoid + _collisionShapeType = SHAPE_TYPE_ELLIPSOID; + } } break; case entity::Shape::Cone: { - if (shapeCalculator) { - shapeCalculator(this, info); - // shapeCalculator only supports convex shapes (e.g. SHAPE_TYPE_HULL) + if (hullShapeCalculator) { + hullShapeCalculator(this, info); _collisionShapeType = SHAPE_TYPE_SIMPLE_HULL; } else { _collisionShapeType = SHAPE_TYPE_ELLIPSOID; @@ -310,9 +321,8 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { case entity::Shape::Triangle: case entity::Shape::Hexagon: case entity::Shape::Octagon: { - if (shapeCalculator) { - shapeCalculator(this, info); - // shapeCalculator only supports convex shapes (e.g. SHAPE_TYPE_HULL) + if (hullShapeCalculator) { + hullShapeCalculator(this, info); _collisionShapeType = SHAPE_TYPE_SIMPLE_HULL; } else { _collisionShapeType = SHAPE_TYPE_ELLIPSOID; @@ -324,9 +334,8 @@ void ShapeEntityItem::computeShapeInfo(ShapeInfo& info) { case entity::Shape::Octahedron: case entity::Shape::Dodecahedron: case entity::Shape::Icosahedron: { - if ( shapeCalculator ) { - shapeCalculator(this, info); - // shapeCalculator only supports convex shapes (e.g. SHAPE_TYPE_HULL) + if ( hullShapeCalculator ) { + hullShapeCalculator(this, info); _collisionShapeType = SHAPE_TYPE_SIMPLE_HULL; } else { _collisionShapeType = SHAPE_TYPE_ELLIPSOID; From 7dc475c695b9a931132bbb6ea1180f0665709b32 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 5 Oct 2017 13:24:51 -0700 Subject: [PATCH 14/39] Update domain server settings Move requests that require access token to go through DS Update various styling and ease of use on DS settings page Update domain server settings CP CP --- .../resources/describe-settings.json | 5 +- domain-server/resources/web/css/style.css | 26 +- domain-server/resources/web/header.html | 4 +- .../resources/web/js/domain-server.js | 3 +- .../resources/web/settings/index.shtml | 5 +- .../resources/web/settings/js/settings.js | 360 +++++++++++++++--- domain-server/src/DomainServer.cpp | 199 ++++++++++ .../embedded-webserver/src/HTTPConnection.cpp | 24 +- .../embedded-webserver/src/HTTPConnection.h | 2 + 9 files changed, 567 insertions(+), 61 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 19f1718370..44713accdb 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -14,7 +14,8 @@ { "name": "id", "label": "Domain ID", - "help": "This is your High Fidelity domain ID. If you do not want your domain to be registered in the High Fidelity metaverse you can leave this blank." + "help": "This is your High Fidelity domain ID. If you do not want your domain to be registered in the High Fidelity metaverse you can leave this blank.", + "advanced": true }, { "name": "automatic_networking", @@ -1513,4 +1514,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/domain-server/resources/web/css/style.css b/domain-server/resources/web/css/style.css index 553f408e15..e157e17b8e 100644 --- a/domain-server/resources/web/css/style.css +++ b/domain-server/resources/web/css/style.css @@ -1,6 +1,7 @@ body { position: relative; padding-bottom: 30px; + margin-top: 70px; } [hidden] { @@ -81,7 +82,7 @@ span.port { #setup-sidebar.affix { position: fixed; - top: 15px; + top: 70px; } #setup-sidebar button { @@ -255,3 +256,26 @@ table .headers + .headers td { -webkit-transform: scale(1.0); } } + +/* From https://gist.github.com/alexandrevicenzi/680147013e902a4eaa5d */ +.glyphicon-refresh-animate { + -animation: spin .7s infinite linear; + -ms-animation: spin .7s infinite linear; + -webkit-animation: spinw .7s infinite linear; + -moz-animation: spinm .7s infinite linear; +} + +@keyframes spin { + from { transform: scale(1) rotate(0deg);} + to { transform: scale(1) rotate(360deg);} +} + +@-webkit-keyframes spinw { + from { -webkit-transform: rotate(0deg);} + to { -webkit-transform: rotate(360deg);} +} + +@-moz-keyframes spinm { + from { -moz-transform: rotate(0deg);} + to { -moz-transform: rotate(360deg);} +} diff --git a/domain-server/resources/web/header.html b/domain-server/resources/web/header.html index a37e9a6ff0..803b36d121 100644 --- a/domain-server/resources/web/header.html +++ b/domain-server/resources/web/header.html @@ -13,7 +13,7 @@ -