diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 5089d5a6ea..d0fc17e3f6 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -356,6 +356,9 @@ void ZoneEntityRenderer::updateHazeFromEntity(const TypedEntityPointer& entity) haze->setHazeAttenuateKeyLight(_hazeProperties.getHazeAttenuateKeyLight()); haze->setHazeKeyLightRangeFactor(model::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeKeyLightRange())); haze->setHazeKeyLightAltitudeFactor(model::convertHazeAltitudeToHazeAltitudeFactor(_hazeProperties.getHazeKeyLightAltitude())); + + haze->setZoneOrientation(_lastRotation); + haze->setZonePosition(_lastPosition); } void ZoneEntityRenderer::updateKeyBackgroundFromEntity(const TypedEntityPointer& entity) { diff --git a/libraries/model/src/model/Haze.cpp b/libraries/model/src/model/Haze.cpp index 6cc9e2b965..9a3e59dfa7 100644 --- a/libraries/model/src/model/Haze.cpp +++ b/libraries/model/src/model/Haze.cpp @@ -17,7 +17,7 @@ using namespace model; Haze::Haze() { Parameters parameters; - _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); + _hazeParametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); } enum HazeModes { @@ -31,141 +31,158 @@ enum HazeModes { // This is separate for each colour. // The colour value is converted from [0.0 .. 1.0] to [5.0 .. 3000.0] void Haze::setHazeColor(const glm::vec3 hazeColor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeColor.r != hazeColor.r) { - _parametersBuffer.edit().hazeColor.r = hazeColor.r; + _hazeParametersBuffer.edit().hazeColor.r = hazeColor.r; float range = hazeColor.r * 2995.0f + 5.0f; float factor = convertHazeRangeToHazeRangeFactor(range); - _parametersBuffer.edit().colorModulationFactor.r = factor; + _hazeParametersBuffer.edit().colorModulationFactor.r = factor; } if (params.hazeColor.g != hazeColor.g) { - _parametersBuffer.edit().hazeColor.g = hazeColor.g; + _hazeParametersBuffer.edit().hazeColor.g = hazeColor.g; float range = hazeColor.g * 2995.0f + 5.0f; float factor = convertHazeRangeToHazeRangeFactor(range); - _parametersBuffer.edit().colorModulationFactor.g = factor; + _hazeParametersBuffer.edit().colorModulationFactor.g = factor; } if (params.hazeColor.b != hazeColor.b) { - _parametersBuffer.edit().hazeColor.b = hazeColor.b; + _hazeParametersBuffer.edit().hazeColor.b = hazeColor.b; float range = hazeColor.b * 2995.0f + 5.0f; float factor = convertHazeRangeToHazeRangeFactor(range); - _parametersBuffer.edit().colorModulationFactor.b = factor; + _hazeParametersBuffer.edit().colorModulationFactor.b = factor; } } void Haze::setDirectionalLightBlend(const float hazeDirectionalLightBlend) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.directionalLightBlend != hazeDirectionalLightBlend) { - _parametersBuffer.edit().directionalLightBlend = hazeDirectionalLightBlend; + _hazeParametersBuffer.edit().directionalLightBlend = hazeDirectionalLightBlend; } } void Haze::setDirectionalLightColor(const glm::vec3 hazeDirectionalLightColor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.directionalLightColor.r != hazeDirectionalLightColor.r) { - _parametersBuffer.edit().directionalLightColor.r = hazeDirectionalLightColor.r; + _hazeParametersBuffer.edit().directionalLightColor.r = hazeDirectionalLightColor.r; } if (params.directionalLightColor.g != hazeDirectionalLightColor.g) { - _parametersBuffer.edit().directionalLightColor.g = hazeDirectionalLightColor.g; + _hazeParametersBuffer.edit().directionalLightColor.g = hazeDirectionalLightColor.g; } if (params.directionalLightColor.b != hazeDirectionalLightColor.b) { - _parametersBuffer.edit().directionalLightColor.b = hazeDirectionalLightColor.b; + _hazeParametersBuffer.edit().directionalLightColor.b = hazeDirectionalLightColor.b; } } void Haze::setHazeActive(const bool isHazeActive) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (((params.hazeMode & HAZE_MODE_IS_ACTIVE) == HAZE_MODE_IS_ACTIVE )&& !isHazeActive) { - _parametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_ACTIVE; + _hazeParametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_ACTIVE; } else if (((params.hazeMode & HAZE_MODE_IS_ACTIVE) != HAZE_MODE_IS_ACTIVE) && isHazeActive) { - _parametersBuffer.edit().hazeMode |= HAZE_MODE_IS_ACTIVE; + _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_ACTIVE; } } void Haze::setAltitudeBased(const bool isAltitudeBased) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (((params.hazeMode & HAZE_MODE_IS_ALTITUDE_BASED) == HAZE_MODE_IS_ALTITUDE_BASED )&& !isAltitudeBased) { - _parametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_ALTITUDE_BASED; + _hazeParametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_ALTITUDE_BASED; } else if (((params.hazeMode & HAZE_MODE_IS_ALTITUDE_BASED) != HAZE_MODE_IS_ALTITUDE_BASED) && isAltitudeBased) { - _parametersBuffer.edit().hazeMode |= HAZE_MODE_IS_ALTITUDE_BASED; + _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_ALTITUDE_BASED; } } void Haze::setHazeAttenuateKeyLight(const bool isHazeAttenuateKeyLight) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (((params.hazeMode & HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) == HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED ) && !isHazeAttenuateKeyLight) { - _parametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED; + _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) { - _parametersBuffer.edit().hazeMode |= HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED; + _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED; } } void Haze::setModulateColorActive(const bool isModulateColorActive) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (((params.hazeMode & HAZE_MODE_IS_MODULATE_COLOR) == HAZE_MODE_IS_MODULATE_COLOR ) && !isModulateColorActive) { - _parametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_MODULATE_COLOR; + _hazeParametersBuffer.edit().hazeMode &= ~HAZE_MODE_IS_MODULATE_COLOR; } else if (((params.hazeMode & HAZE_MODE_IS_MODULATE_COLOR) != HAZE_MODE_IS_MODULATE_COLOR) && isModulateColorActive) { - _parametersBuffer.edit().hazeMode |= HAZE_MODE_IS_MODULATE_COLOR; + _hazeParametersBuffer.edit().hazeMode |= HAZE_MODE_IS_MODULATE_COLOR; } } void Haze::setHazeRangeFactor(const float hazeRangeFactor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeRangeFactor != hazeRangeFactor) { - _parametersBuffer.edit().hazeRangeFactor = hazeRangeFactor; + _hazeParametersBuffer.edit().hazeRangeFactor = hazeRangeFactor; } } void Haze::setHazeAltitudeFactor(const float hazeAltitudeFactor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeAltitudeFactor != hazeAltitudeFactor) { - _parametersBuffer.edit().hazeAltitudeFactor = hazeAltitudeFactor; + _hazeParametersBuffer.edit().hazeAltitudeFactor = hazeAltitudeFactor; } } void Haze::setHazeKeyLightRangeFactor(const float hazeKeyLightRangeFactor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeKeyLightRangeFactor != hazeKeyLightRangeFactor) { - _parametersBuffer.edit().hazeKeyLightRangeFactor = hazeKeyLightRangeFactor; + _hazeParametersBuffer.edit().hazeKeyLightRangeFactor = hazeKeyLightRangeFactor; } } void Haze::setHazeKeyLightAltitudeFactor(const float hazeKeyLightAltitudeFactor) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeKeyLightAltitudeFactor != hazeKeyLightAltitudeFactor) { - _parametersBuffer.edit().hazeKeyLightAltitudeFactor = hazeKeyLightAltitudeFactor; + _hazeParametersBuffer.edit().hazeKeyLightAltitudeFactor = hazeKeyLightAltitudeFactor; } } void Haze::setHazeBaseReference(const float hazeBaseReference) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeBaseReference != hazeBaseReference) { - _parametersBuffer.edit().hazeBaseReference = hazeBaseReference; + _hazeParametersBuffer.edit().hazeBaseReference = hazeBaseReference; } } void Haze::setHazeBackgroundBlendValue(const float hazeBackgroundBlendValue) { - auto& params = _parametersBuffer.get(); + auto& params = _hazeParametersBuffer.get(); if (params.hazeBackgroundBlendValue != hazeBackgroundBlendValue) { - _parametersBuffer.edit().hazeBackgroundBlendValue = hazeBackgroundBlendValue; + _hazeParametersBuffer.edit().hazeBackgroundBlendValue = hazeBackgroundBlendValue; + } +} + +void Haze::setZoneOrientation(const glm::quat& zoneOrientation) { + auto& params = _hazeParametersBuffer.get(); + + glm::vec3 zoneDirection = zoneOrientation * glm::vec3(0.0f, 0.0f, -1.0f); + if (params.zoneDirection == zoneDirection) { + _hazeParametersBuffer.edit().zoneDirection = zoneDirection; + } +} + +void Haze::setZonePosition(const glm::vec3& zonePosition) { + auto& params = _hazeParametersBuffer.get(); + + if (params.zonePosition != zonePosition) { + _hazeParametersBuffer.edit().zonePosition = zonePosition; } } diff --git a/libraries/model/src/model/Haze.h b/libraries/model/src/model/Haze.h index 55ee2c1a5a..880b1c6f8c 100644 --- a/libraries/model/src/model/Haze.h +++ b/libraries/model/src/model/Haze.h @@ -12,6 +12,7 @@ #define hifi_model_Haze_h #include +#include "Transform.h" #include "NumericalConstants.h" namespace model { @@ -83,7 +84,10 @@ namespace model { void setHazeBackgroundBlendValue(const float hazeBackgroundBlendValue); - UniformBufferView getHazeParametersBuffer() const { return _parametersBuffer; } + void setZoneOrientation(const glm::quat& zoneOrientation); + void setZonePosition(const glm::vec3& zonePosition); + + UniformBufferView getHazeParametersBuffer() const { return _hazeParametersBuffer; } protected: class Parameters { @@ -100,6 +104,12 @@ namespace model { // bit 1 - set to add the effect of altitude to the haze attenuation // bit 2 - set to activate directional light attenuation mode + glm::vec3 zoneDirection; + + // Amount of background (skybox) to display, overriding the haze effect for the background + float hazeBackgroundBlendValue{ initialHazeBackgroundBlendValue }; + glm::vec3 zonePosition; + // The haze attenuation exponents used by both fragment and directional light attenuation float hazeRangeFactor{ convertHazeRangeToHazeRangeFactor(initialHazeRange_m) }; float hazeAltitudeFactor{ convertHazeAltitudeToHazeAltitudeFactor(initialHazeAltitude_m) }; @@ -107,13 +117,10 @@ namespace model { float hazeKeyLightRangeFactor{ convertHazeRangeToHazeRangeFactor(initialHazeKeyLightRange_m) }; float hazeKeyLightAltitudeFactor{ convertHazeAltitudeToHazeAltitudeFactor(initialHazeKeyLightAltitude_m) }; - // Amount of background (skybox) to display, overriding the haze effect for the background - float hazeBackgroundBlendValue{ initialHazeBackgroundBlendValue }; - Parameters() {} }; - UniformBufferView _parametersBuffer; + UniformBufferView _hazeParametersBuffer; }; using HazePointer = std::shared_ptr; diff --git a/libraries/render-utils/src/Haze.slh b/libraries/render-utils/src/Haze.slh index 624a859de7..42e561f2fe 100644 --- a/libraries/render-utils/src/Haze.slh +++ b/libraries/render-utils/src/Haze.slh @@ -25,13 +25,16 @@ struct HazeParams { vec3 colorModulationFactor; int hazeMode; + vec3 zoneDirection; + float backgroundBlendValue; + + vec3 zonePosition; + float hazeRangeFactor; float hazeAltitudeFactor; float hazeRangeFactorKeyLight; float hazeAltitudeFactorKeyLight; - - float backgroundBlendValue; }; layout(std140) uniform hazeBuffer {