Zone position/direction sent to haze uniform.

This commit is contained in:
Nissim Hadar 2017-10-06 17:24:20 -07:00
parent e34fb1c874
commit e02876f1ea
4 changed files with 75 additions and 45 deletions

View file

@ -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) {

View file

@ -17,7 +17,7 @@ using namespace model;
Haze::Haze() {
Parameters parameters;
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) &parameters));
_hazeParametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) &parameters));
}
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<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeColor.r != hazeColor.r) {
_parametersBuffer.edit<Parameters>().hazeColor.r = hazeColor.r;
_hazeParametersBuffer.edit<Parameters>().hazeColor.r = hazeColor.r;
float range = hazeColor.r * 2995.0f + 5.0f;
float factor = convertHazeRangeToHazeRangeFactor(range);
_parametersBuffer.edit<Parameters>().colorModulationFactor.r = factor;
_hazeParametersBuffer.edit<Parameters>().colorModulationFactor.r = factor;
}
if (params.hazeColor.g != hazeColor.g) {
_parametersBuffer.edit<Parameters>().hazeColor.g = hazeColor.g;
_hazeParametersBuffer.edit<Parameters>().hazeColor.g = hazeColor.g;
float range = hazeColor.g * 2995.0f + 5.0f;
float factor = convertHazeRangeToHazeRangeFactor(range);
_parametersBuffer.edit<Parameters>().colorModulationFactor.g = factor;
_hazeParametersBuffer.edit<Parameters>().colorModulationFactor.g = factor;
}
if (params.hazeColor.b != hazeColor.b) {
_parametersBuffer.edit<Parameters>().hazeColor.b = hazeColor.b;
_hazeParametersBuffer.edit<Parameters>().hazeColor.b = hazeColor.b;
float range = hazeColor.b * 2995.0f + 5.0f;
float factor = convertHazeRangeToHazeRangeFactor(range);
_parametersBuffer.edit<Parameters>().colorModulationFactor.b = factor;
_hazeParametersBuffer.edit<Parameters>().colorModulationFactor.b = factor;
}
}
void Haze::setDirectionalLightBlend(const float hazeDirectionalLightBlend) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.directionalLightBlend != hazeDirectionalLightBlend) {
_parametersBuffer.edit<Parameters>().directionalLightBlend = hazeDirectionalLightBlend;
_hazeParametersBuffer.edit<Parameters>().directionalLightBlend = hazeDirectionalLightBlend;
}
}
void Haze::setDirectionalLightColor(const glm::vec3 hazeDirectionalLightColor) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.directionalLightColor.r != hazeDirectionalLightColor.r) {
_parametersBuffer.edit<Parameters>().directionalLightColor.r = hazeDirectionalLightColor.r;
_hazeParametersBuffer.edit<Parameters>().directionalLightColor.r = hazeDirectionalLightColor.r;
}
if (params.directionalLightColor.g != hazeDirectionalLightColor.g) {
_parametersBuffer.edit<Parameters>().directionalLightColor.g = hazeDirectionalLightColor.g;
_hazeParametersBuffer.edit<Parameters>().directionalLightColor.g = hazeDirectionalLightColor.g;
}
if (params.directionalLightColor.b != hazeDirectionalLightColor.b) {
_parametersBuffer.edit<Parameters>().directionalLightColor.b = hazeDirectionalLightColor.b;
_hazeParametersBuffer.edit<Parameters>().directionalLightColor.b = hazeDirectionalLightColor.b;
}
}
void Haze::setHazeActive(const bool isHazeActive) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (((params.hazeMode & HAZE_MODE_IS_ACTIVE) == HAZE_MODE_IS_ACTIVE )&& !isHazeActive) {
_parametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_ACTIVE;
_hazeParametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_ACTIVE;
}
else if (((params.hazeMode & HAZE_MODE_IS_ACTIVE) != HAZE_MODE_IS_ACTIVE) && isHazeActive) {
_parametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_ACTIVE;
_hazeParametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_ACTIVE;
}
}
void Haze::setAltitudeBased(const bool isAltitudeBased) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (((params.hazeMode & HAZE_MODE_IS_ALTITUDE_BASED) == HAZE_MODE_IS_ALTITUDE_BASED )&& !isAltitudeBased) {
_parametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_ALTITUDE_BASED;
_hazeParametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_ALTITUDE_BASED;
}
else if (((params.hazeMode & HAZE_MODE_IS_ALTITUDE_BASED) != HAZE_MODE_IS_ALTITUDE_BASED) && isAltitudeBased) {
_parametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_ALTITUDE_BASED;
_hazeParametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_ALTITUDE_BASED;
}
}
void Haze::setHazeAttenuateKeyLight(const bool isHazeAttenuateKeyLight) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (((params.hazeMode & HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED) == HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED ) && !isHazeAttenuateKeyLight) {
_parametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED;
_hazeParametersBuffer.edit<Parameters>().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<Parameters>().hazeMode |= HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED;
_hazeParametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_DIRECTIONAL_LIGHT_ATTENUATED;
}
}
void Haze::setModulateColorActive(const bool isModulateColorActive) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (((params.hazeMode & HAZE_MODE_IS_MODULATE_COLOR) == HAZE_MODE_IS_MODULATE_COLOR ) && !isModulateColorActive) {
_parametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_MODULATE_COLOR;
_hazeParametersBuffer.edit<Parameters>().hazeMode &= ~HAZE_MODE_IS_MODULATE_COLOR;
}
else if (((params.hazeMode & HAZE_MODE_IS_MODULATE_COLOR) != HAZE_MODE_IS_MODULATE_COLOR) && isModulateColorActive) {
_parametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_MODULATE_COLOR;
_hazeParametersBuffer.edit<Parameters>().hazeMode |= HAZE_MODE_IS_MODULATE_COLOR;
}
}
void Haze::setHazeRangeFactor(const float hazeRangeFactor) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeRangeFactor != hazeRangeFactor) {
_parametersBuffer.edit<Parameters>().hazeRangeFactor = hazeRangeFactor;
_hazeParametersBuffer.edit<Parameters>().hazeRangeFactor = hazeRangeFactor;
}
}
void Haze::setHazeAltitudeFactor(const float hazeAltitudeFactor) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeAltitudeFactor != hazeAltitudeFactor) {
_parametersBuffer.edit<Parameters>().hazeAltitudeFactor = hazeAltitudeFactor;
_hazeParametersBuffer.edit<Parameters>().hazeAltitudeFactor = hazeAltitudeFactor;
}
}
void Haze::setHazeKeyLightRangeFactor(const float hazeKeyLightRangeFactor) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeKeyLightRangeFactor != hazeKeyLightRangeFactor) {
_parametersBuffer.edit<Parameters>().hazeKeyLightRangeFactor = hazeKeyLightRangeFactor;
_hazeParametersBuffer.edit<Parameters>().hazeKeyLightRangeFactor = hazeKeyLightRangeFactor;
}
}
void Haze::setHazeKeyLightAltitudeFactor(const float hazeKeyLightAltitudeFactor) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeKeyLightAltitudeFactor != hazeKeyLightAltitudeFactor) {
_parametersBuffer.edit<Parameters>().hazeKeyLightAltitudeFactor = hazeKeyLightAltitudeFactor;
_hazeParametersBuffer.edit<Parameters>().hazeKeyLightAltitudeFactor = hazeKeyLightAltitudeFactor;
}
}
void Haze::setHazeBaseReference(const float hazeBaseReference) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeBaseReference != hazeBaseReference) {
_parametersBuffer.edit<Parameters>().hazeBaseReference = hazeBaseReference;
_hazeParametersBuffer.edit<Parameters>().hazeBaseReference = hazeBaseReference;
}
}
void Haze::setHazeBackgroundBlendValue(const float hazeBackgroundBlendValue) {
auto& params = _parametersBuffer.get<Parameters>();
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.hazeBackgroundBlendValue != hazeBackgroundBlendValue) {
_parametersBuffer.edit<Parameters>().hazeBackgroundBlendValue = hazeBackgroundBlendValue;
_hazeParametersBuffer.edit<Parameters>().hazeBackgroundBlendValue = hazeBackgroundBlendValue;
}
}
void Haze::setZoneOrientation(const glm::quat& zoneOrientation) {
auto& params = _hazeParametersBuffer.get<Parameters>();
glm::vec3 zoneDirection = zoneOrientation * glm::vec3(0.0f, 0.0f, -1.0f);
if (params.zoneDirection == zoneDirection) {
_hazeParametersBuffer.edit<Parameters>().zoneDirection = zoneDirection;
}
}
void Haze::setZonePosition(const glm::vec3& zonePosition) {
auto& params = _hazeParametersBuffer.get<Parameters>();
if (params.zonePosition != zonePosition) {
_hazeParametersBuffer.edit<Parameters>().zonePosition = zonePosition;
}
}

View file

@ -12,6 +12,7 @@
#define hifi_model_Haze_h
#include <glm/glm.hpp>
#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<Haze>;

View file

@ -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 {