diff --git a/examples/utilities/tools/render/framebuffer.qml b/examples/utilities/tools/render/framebuffer.qml index e31f986bc1..d6f4ea7915 100644 --- a/examples/utilities/tools/render/framebuffer.qml +++ b/examples/utilities/tools/render/framebuffer.qml @@ -31,8 +31,7 @@ Column { "Albedo", "Normal", "Roughness", - "Metallic", - "Fresnel", + "Metallic", "Emissive", "Occlusion", "Lightmap", diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7314bce0bd..29c8e136af 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3818,18 +3818,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se }); } - // Setup the current Zone Entity lighting and skybox + // Setup the current Zone Entity lighting { - // FIXME: Use a zone setting to determine the ambient light mode - DependencyManager::get()->setAmbientLightMode(-1); - auto skyStage = DependencyManager::get()->getSkyStage(); - DependencyManager::get()->setGlobalLight(skyStage->getSunLight()->getDirection(), skyStage->getSunLight()->getColor(), skyStage->getSunLight()->getIntensity(), skyStage->getSunLight()->getAmbientIntensity()); - - auto skybox = model::SkyboxPointer(); - if (skyStage->getBackgroundMode() == model::SunSkyStage::SKY_BOX) { - skybox = skyStage->getSkybox(); - } - DependencyManager::get()->setGlobalSkybox(skybox); + auto stage = DependencyManager::get()->getSkyStage(); + DependencyManager::get()->setGlobalLight(stage->getSunLight(), stage->getSkybox()->getCubemap()); } { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 85a4b13b29..3bf1e7bc92 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -140,7 +140,8 @@ void EntityTreeRenderer::update() { // even if we haven't changed positions, if we previously attempted to set the skybox, but // have a pending download of the skybox texture, then we should attempt to reapply to // get the correct texture. - if (_pendingSkyboxTexture && _skyboxTexture && _skyboxTexture->isLoaded()) { + if ((_pendingSkyboxTexture && _skyboxTexture && _skyboxTexture->isLoaded()) || + (_pendingAmbientTexture && _ambientTexture && _ambientTexture->isLoaded())) { applyZonePropertiesToScene(_bestZone); } @@ -253,6 +254,7 @@ void EntityTreeRenderer::forceRecheckEntities() { void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr zone) { + auto textureCache = DependencyManager::get(); auto scene = DependencyManager::get(); auto sceneStage = scene->getStage(); auto skyStage = scene->getSkyStage(); @@ -264,7 +266,11 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrresetAmbientSphere(); sceneKeyLight->setColor(_previousKeyLightColor); sceneKeyLight->setIntensity(_previousKeyLightIntensity); sceneKeyLight->setAmbientIntensity(_previousKeyLightAmbientIntensity); @@ -274,6 +280,7 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrsetHour(_previousStageHour); sceneTime->setDay(_previousStageDay); + _hasPreviousZone = false; } @@ -306,6 +313,23 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrsetHour(zone->getStageProperties().calculateHour()); sceneTime->setDay(zone->getStageProperties().calculateDay()); + bool isAmbientTextureSet = false; + if (zone->getKeyLightProperties().getAmbientURL().isEmpty()) { + _pendingAmbientTexture = false; + _ambientTexture.clear(); + } else { + _ambientTexture = textureCache->getTexture(zone->getKeyLightProperties().getAmbientURL(), CUBE_TEXTURE); + if (_ambientTexture->getGPUTexture()) { + _pendingAmbientTexture = false; + if (_ambientTexture->getGPUTexture()->getIrradiance()) { + sceneKeyLight->setAmbientSphere(_ambientTexture->getGPUTexture()->getIrradiance()); + isAmbientTextureSet = true; + } + } else { + _pendingAmbientTexture = true; + } + } + switch (zone->getBackgroundMode()) { case BACKGROUND_MODE_SKYBOX: { auto skybox = std::dynamic_pointer_cast(skyStage->getSkybox()); @@ -326,12 +350,16 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr(); _skyboxTexture = textureCache->getTexture(zone->getSkyboxProperties().getURL(), CUBE_TEXTURE); if (_skyboxTexture->getGPUTexture()) { - skybox->setCubemap(_skyboxTexture->getGPUTexture()); + auto texture = _skyboxTexture->getGPUTexture(); + skybox->setCubemap(texture); _pendingSkyboxTexture = false; + if (!isAmbientTextureSet && texture->getIrradiance()) { + sceneKeyLight->setAmbientSphere(texture->getIrradiance()); + isAmbientTextureSet = true; + } } else { _pendingSkyboxTexture = true; } @@ -348,6 +376,10 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptrresetAmbientSphere(); + } } const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(EntityItemPointer entityItem) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index f0454b2ecf..f1598221dd 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -146,6 +146,9 @@ private: bool _pendingSkyboxTexture { false }; NetworkTexturePointer _skyboxTexture; + bool _pendingAmbientTexture { false }; + NetworkTexturePointer _ambientTexture; + bool _wantScripts; ScriptEngine* _entitiesScriptEngine; diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index b7e0a70b85..cac47c907a 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -30,7 +30,7 @@ void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desired COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_INTENSITY, KeyLight, keyLight, Intensity, intensity); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_AMBIENT_INTENSITY, KeyLight, keyLight, AmbientIntensity, ambientIntensity); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_DIRECTION, KeyLight, keyLight, Direction, direction); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_AMBIENT_URL, KeyLight, keyLight, AmbientURL, ambientUrl); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_AMBIENT_URL, KeyLight, keyLight, AmbientURL, ambientURL); } diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 6a59ac6aef..5371d5a41d 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -131,11 +131,10 @@ class FBXMaterial { public: FBXMaterial() {}; FBXMaterial(const glm::vec3& diffuseColor, const glm::vec3& specularColor, const glm::vec3& emissiveColor, - const glm::vec2& emissiveParams, float shininess, float opacity) : + float shininess, float opacity) : diffuseColor(diffuseColor), specularColor(specularColor), emissiveColor(emissiveColor), - lightmapParams(emissiveParams), shininess(shininess), opacity(opacity) {} diff --git a/libraries/fbx/src/FBXReader_Material.cpp b/libraries/fbx/src/FBXReader_Material.cpp index 188c50304d..cc6452c620 100644 --- a/libraries/fbx/src/FBXReader_Material.cpp +++ b/libraries/fbx/src/FBXReader_Material.cpp @@ -185,8 +185,6 @@ void FBXReader::consolidateFBXMaterials() { } else { material._material->setRoughness(model::Material::shininessToRoughness(material.shininess)); float metallic = std::max(material.specularColor.x, std::max(material.specularColor.y, material.specularColor.z)); - // FIXME: Do not use the Specular Factor yet as some FBX models have it set to 0 - // metallic *= material.specularFactor; material._material->setMetallic(metallic); } diff --git a/libraries/fbx/src/OBJReader.cpp b/libraries/fbx/src/OBJReader.cpp index 8791372ee0..e735ba06d9 100644 --- a/libraries/fbx/src/OBJReader.cpp +++ b/libraries/fbx/src/OBJReader.cpp @@ -558,7 +558,6 @@ FBXGeometry* OBJReader::readOBJ(QByteArray& model, const QVariantHash& mapping, geometry.materials[materialID] = FBXMaterial(objMaterial.diffuseColor, objMaterial.specularColor, glm::vec3(0.0f), - glm::vec2(0.0f, 1.0f), objMaterial.shininess, objMaterial.opacity); FBXMaterial& fbxMaterial = geometry.materials[materialID]; diff --git a/libraries/gpu/src/gpu/GLBackendTexture.cpp b/libraries/gpu/src/gpu/GLBackendTexture.cpp index d84d3e3967..8efb4736c1 100755 --- a/libraries/gpu/src/gpu/GLBackendTexture.cpp +++ b/libraries/gpu/src/gpu/GLBackendTexture.cpp @@ -145,6 +145,8 @@ public: switch(dstFormat.getSemantic()) { case gpu::RGB: case gpu::RGBA: + case gpu::SRGB: + case gpu::SRGBA: texel.internalFormat = GL_RED; switch (dstFormat.getType()) { case gpu::UINT32: { @@ -196,7 +198,11 @@ public: break; } case gpu::NUINT8: { - texel.internalFormat = GL_R8; + if ((dstFormat.getSemantic() == gpu::SRGB || dstFormat.getSemantic() == gpu::SRGBA)) { + texel.internalFormat = GL_SLUMINANCE8; + } else { + texel.internalFormat = GL_R8; + } break; } case gpu::NINT8: { @@ -209,6 +215,7 @@ public: } break; + case gpu::DEPTH: texel.format = GL_DEPTH_COMPONENT; // It's depth component to load it texel.internalFormat = GL_DEPTH_COMPONENT; diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 7d59bb5028..7dea008e1d 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -363,7 +363,7 @@ static NetworkMaterial* buildNetworkMaterial(NetworkGeometry* geometry, const FB material._material->setTextureMap(model::MaterialKey::METALLIC_MAP, metallicMap); } if (!material.roughnessTexture.filename.isEmpty()) { - material.roughnessTexture.isGlossmap; + // FIXME: COnvert from gloss to roughness if material.roughnessTexture.isGlossmap; networkMaterial->roughnessTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.roughnessTexture.filename)), ROUGHNESS_TEXTURE, material.roughnessTexture.content); networkMaterial->roughnessTextureName = material.roughnessTexture.name; diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index c10b82d235..1b8c73bb80 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -216,12 +216,15 @@ NetworkTexture::TextureLoaderFunc NetworkTexture::getTextureLoader() const { return TextureLoaderFunc(model::TextureUsage::createRoughnessTextureFromImage); break; } + case SPECULAR_TEXTURE: { + return TextureLoaderFunc(model::TextureUsage::createMetallicTextureFromImage); + break; + } case CUSTOM_TEXTURE: { return _textureLoader; break; } case DEFAULT_TEXTURE: - case SPECULAR_TEXTURE: case EMISSIVE_TEXTURE: default: { return TextureLoaderFunc(model::TextureUsage::create2DTextureFromImage); diff --git a/libraries/model/src/model/Stage.cpp b/libraries/model/src/model/Stage.cpp index 0ff613bd4b..6a1e95936b 100644 --- a/libraries/model/src/model/Stage.cpp +++ b/libraries/model/src/model/Stage.cpp @@ -202,14 +202,13 @@ void SunSkyStage::setSunModelEnable(bool isEnabled) { invalidate(); } -void SunSkyStage::setSunColor(const Vec3& color) { - _sunLight->setColor(color); -} -void SunSkyStage::setSunIntensity(float intensity) { - _sunLight->setIntensity(intensity); -} -void SunSkyStage::setSunAmbientIntensity(float intensity) { - _sunLight->setAmbientIntensity(intensity); +void SunSkyStage::setSunAmbientSphere(const gpu::SHPointer& sphere) { + if (sphere) { + _sunLight->setAmbientSphere(*sphere); + } else { + const gpu::SphericalHarmonics::Preset DEFAULT_AMBIENT_SPHERE = gpu::SphericalHarmonics::OLD_TOWN_SQUARE; + _sunLight->setAmbientSpherePreset(DEFAULT_AMBIENT_SPHERE); + } } void SunSkyStage::setSunDirection(const Vec3& direction) { diff --git a/libraries/model/src/model/Stage.h b/libraries/model/src/model/Stage.h index 912a7b77a8..31772d5e48 100644 --- a/libraries/model/src/model/Stage.h +++ b/libraries/model/src/model/Stage.h @@ -11,7 +11,7 @@ #ifndef hifi_model_Stage_h #define hifi_model_Stage_h -#include "gpu/Pipeline.h" +#include #include "Light.h" #include "Skybox.h" @@ -143,12 +143,13 @@ public: bool isSunModelEnabled() const { return _sunModelEnable; } // Sun properties - void setSunColor(const Vec3& color); + void setSunColor(const Vec3& color) { _sunLight->setColor(color); } const Vec3& getSunColor() const { return getSunLight()->getColor(); } - void setSunIntensity(float intensity); + void setSunIntensity(float intensity) { _sunLight->setIntensity(intensity); } float getSunIntensity() const { return getSunLight()->getIntensity(); } - void setSunAmbientIntensity(float intensity); + void setSunAmbientIntensity(float intensity) { _sunLight->setAmbientIntensity(intensity); } float getSunAmbientIntensity() const { return getSunLight()->getAmbientIntensity(); } + void setSunAmbientSphere(const gpu::SHPointer& sphere); // The sun direction is expressed in the world space void setSunDirection(const Vec3& direction); diff --git a/libraries/model/src/model/TextureMap.cpp b/libraries/model/src/model/TextureMap.cpp index b75f2d6acc..b2504c4085 100755 --- a/libraries/model/src/model/TextureMap.cpp +++ b/libraries/model/src/model/TextureMap.cpp @@ -264,27 +264,38 @@ gpu::Texture* TextureUsage::createRoughnessTextureFromImage(const QImage& srcIma image = image.convertToFormat(QImage::Format_Grayscale8); - /* gpu::Texture* theTexture = nullptr; + gpu::Texture* theTexture = nullptr; if ((image.width() > 0) && (image.height() > 0)) { - // Actual alpha channel? - for (int y = 0; y < image.height(); ++y) { - QRgb* data = reinterpret_cast(image.scanLine(y)); - for (int x = 0; x < image.width(); ++x) { - data[x]auto alpha = q(data[x]); - if (alpha != 255) { - validAlpha = true; - break; - } + gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB); + gpu::Element formatMip = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB); + + theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR))); + theTexture->assignStoredMip(0, formatMip, image.byteCount(), image.constBits()); + theTexture->autoGenerateMips(-1); + + // FIXME queue for transfer to GPU and block on completion + } + + return theTexture; +} + +gpu::Texture* TextureUsage::createMetallicTextureFromImage(const QImage& srcImage, const std::string& srcImageName) { + QImage image = srcImage; + if (!image.hasAlphaChannel()) { + if (image.format() != QImage::Format_RGB888) { + image = image.convertToFormat(QImage::Format_RGB888); + } + } else { + if (image.format() != QImage::Format_ARGB32) { + image = image.convertToFormat(QImage::Format_ARGB32); } } - */ + image = image.convertToFormat(QImage::Format_Grayscale8); gpu::Texture* theTexture = nullptr; if ((image.width() > 0) && (image.height() > 0)) { - // bool isLinearRGB = true; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE); - bool isLinearRGB = false; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE); gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB); gpu::Element formatMip = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB); diff --git a/libraries/model/src/model/TextureMap.h b/libraries/model/src/model/TextureMap.h index 1e7f313dc8..886bc9d3b3 100755 --- a/libraries/model/src/model/TextureMap.h +++ b/libraries/model/src/model/TextureMap.h @@ -35,6 +35,7 @@ public: static gpu::Texture* createNormalTextureFromNormalImage(const QImage& image, const std::string& srcImageName); static gpu::Texture* createNormalTextureFromBumpImage(const QImage& image, const std::string& srcImageName); static gpu::Texture* createRoughnessTextureFromImage(const QImage& image, const std::string& srcImageName); + static gpu::Texture* createMetallicTextureFromImage(const QImage& image, const std::string& srcImageName); static gpu::Texture* createCubeTextureFromImage(const QImage& image, const std::string& srcImageName); static gpu::Texture* createLightmapTextureFromImage(const QImage& image, const std::string& srcImageName); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index c4c7d8c9c4..c9ea223b3f 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -60,29 +60,23 @@ static const std::string DEFAULT_ALBEDO_SHADER { " }" }; -static const std::string DEFAULT_FRESNEL_SHADER{ - "vec4 getFragmentColor() {" - " DeferredFragment frag = unpackDeferredFragmentNoPosition(uv);" - " return vec4(pow(frag.specular, vec3(1.0 / 2.2)), 1.0);" - " }" -}; - static const std::string DEFAULT_METALLIC_SHADER { "vec4 getFragmentColor() {" " DeferredFragment frag = unpackDeferredFragmentNoPosition(uv);" - " return vec4(vec3(frag.metallic), 1.0);" + " return vec4(vec3(pow(frag.metallic, 1.0 / 2.2)), 1.0);" " }" }; + static const std::string DEFAULT_ROUGHNESS_SHADER { "vec4 getFragmentColor() {" " DeferredFragment frag = unpackDeferredFragmentNoPosition(uv);" - " return vec4(vec3(frag.roughness), 1.0);" + " return vec4(vec3(pow(frag.roughness, 1.0 / 2.2)), 1.0);" " }" }; static const std::string DEFAULT_NORMAL_SHADER { "vec4 getFragmentColor() {" " DeferredFragment frag = unpackDeferredFragmentNoPosition(uv);" - " return vec4(normalize(frag.normal), 1.0);" + " return vec4(vec3(0.5) + (frag.normal * 0.5), 1.0);" " }" }; @@ -180,8 +174,6 @@ std::string DebugDeferredBuffer::getShaderSourceCode(Mode mode, std::string cust switch (mode) { case AlbedoMode: return DEFAULT_ALBEDO_SHADER; - case FresnelMode: - return DEFAULT_FRESNEL_SHADER; case MetallicMode: return DEFAULT_METALLIC_SHADER; case RoughnessMode: diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index f4eacea5b6..f00dd58f0e 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -52,7 +52,6 @@ protected: NormalMode, RoughnessMode, MetallicMode, - FresnelMode, EmissiveMode, OcclusionMode, LightmapMode, diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index bdc9ea07d0..36b065c2b8 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -312,15 +312,13 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo // First Global directional light and ambient pass { - bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); - auto& program = _shadowMapEnabled ? _directionalLightShadow : _directionalLight; LightLocationsPtr locations = _shadowMapEnabled ? _directionalLightShadowLocations : _directionalLightLocations; // Setup the global directional pass pipeline { if (_shadowMapEnabled) { - if (useSkyboxCubemap) { + if (_skyboxTexture) { program = _directionalSkyboxLightShadow; locations = _directionalSkyboxLightShadowLocations; } else if (_ambientLightMode > -1) { @@ -328,7 +326,7 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo locations = _directionalAmbientSphereLightShadowLocations; } } else { - if (useSkyboxCubemap) { + if (_skyboxTexture) { program = _directionalSkyboxLight; locations = _directionalSkyboxLightLocations; } else if (_ambientLightMode > -1) { @@ -356,7 +354,7 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo geometryCache->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); } - if (useSkyboxCubemap) { + if (_skyboxTexture) { batch.setResourceTexture(SKYBOX_MAP_UNIT, nullptr); } } @@ -501,9 +499,8 @@ void DeferredLightingEffect::setupKeyLightBatch(gpu::Batch& batch, int lightBuff batch.setUniformBuffer(lightBufferUnit, globalLight->getSchemaBuffer()); } - bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); - if (useSkyboxCubemap && (skyboxCubemapUnit >= 0)) { - batch.setResourceTexture(skyboxCubemapUnit, _skybox->getCubemap()); + if (_skyboxTexture && (skyboxCubemapUnit >= 0)) { + batch.setResourceTexture(skyboxCubemapUnit, _skyboxTexture); } } @@ -562,32 +559,9 @@ static void loadLightProgram(const char* vertSource, const char* fragSource, boo } -void DeferredLightingEffect::setAmbientLightMode(int preset) { - if ((preset >= 0) && (preset < gpu::SphericalHarmonics::NUM_PRESET)) { - _ambientLightMode = preset; - auto light = _allocatedLights.front(); - light->setAmbientSpherePreset(gpu::SphericalHarmonics::Preset(preset % gpu::SphericalHarmonics::NUM_PRESET)); - } else { - // force to preset 0 - setAmbientLightMode(0); - } -} - -void DeferredLightingEffect::setGlobalLight(const glm::vec3& direction, const glm::vec3& color, float intensity, float ambientIntensity) { - auto light = _allocatedLights.front(); - light->setDirection(direction); - light->setColor(color); - light->setIntensity(intensity); - light->setAmbientIntensity(ambientIntensity); -} - -void DeferredLightingEffect::setGlobalSkybox(const model::SkyboxPointer& skybox) { - _skybox = skybox; - auto light = _allocatedLights.front(); - - if (_skybox && _skybox->getCubemap() && _skybox->getCubemap()->isDefined() && _skybox->getCubemap()->getIrradiance()) { - light->setAmbientSphere( (*_skybox->getCubemap()->getIrradiance()) ); - } +void DeferredLightingEffect::setGlobalLight(const model::LightPointer& light, const gpu::TexturePointer& skyboxTexture) { + _allocatedLights.front() = light; + _skyboxTexture = skyboxTexture; } model::MeshPointer DeferredLightingEffect::getSpotLightMesh() { diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index ad52cdce96..d19ce9929c 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -18,7 +18,6 @@ #include #include "model/Light.h" -#include "model/Stage.h" #include "model/Geometry.h" #include "render/Context.h" @@ -49,9 +48,7 @@ public: void setupKeyLightBatch(gpu::Batch& batch, int lightBufferUnit, int skyboxCubemapUnit); // update global lighting - void setAmbientLightMode(int preset); - void setGlobalLight(const glm::vec3& direction, const glm::vec3& color, float intensity, float ambientIntensity); - void setGlobalSkybox(const model::SkyboxPointer& skybox); + void setGlobalLight(const model::LightPointer& light, const gpu::TexturePointer& skyboxTexture); const LightStage& getLightStage() { return _lightStage; } void setShadowMapEnabled(bool enable) { _shadowMapEnabled = enable; }; @@ -99,7 +96,7 @@ private: std::vector _spotLights; int _ambientLightMode = 0; - model::SkyboxPointer _skybox; + gpu::TexturePointer _skyboxTexture; // Class describing the uniform buffer with all the parameters common to the deferred shaders class DeferredTransform { diff --git a/libraries/render-utils/src/MaterialTextures.slh b/libraries/render-utils/src/MaterialTextures.slh index d0f2563d43..5372419465 100644 --- a/libraries/render-utils/src/MaterialTextures.slh +++ b/libraries/render-utils/src/MaterialTextures.slh @@ -23,7 +23,7 @@ vec4 fetchAlbedoMap(vec2 uv) { <@if withRoughness@> uniform sampler2D roughnessMap; float fetchRoughnessMap(vec2 uv) { - return texture(roughnessMap, uv).r; + return pow(texture(roughnessMap, uv).r, 2.2); } <@endif@> @@ -37,7 +37,7 @@ vec3 fetchNormalMap(vec2 uv) { <@if withMetallic@> uniform sampler2D specularMap; float fetchMetallicMap(vec2 uv) { - return texture(specularMap, uv).r; + return pow(texture(specularMap, uv).r, 2.2); } <@endif@> diff --git a/libraries/script-engine/src/SceneScriptingInterface.cpp b/libraries/script-engine/src/SceneScriptingInterface.cpp index b2f3824221..079cfff2c7 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.cpp +++ b/libraries/script-engine/src/SceneScriptingInterface.cpp @@ -77,6 +77,10 @@ void SceneScripting::KeyLight::setAmbientIntensity(float intensity) { _skyStage->setSunAmbientIntensity(intensity); } +void SceneScripting::KeyLight::setAmbientSphere(const gpu::SHPointer& sphere) { + _skyStage->setSunAmbientSphere(sphere); +} + glm::vec3 SceneScripting::KeyLight::getDirection() const { return _skyStage->getSunDirection(); } diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 0be8b066aa..12681b1887 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -81,6 +81,10 @@ namespace SceneScripting { // setDirection is only effective if stage Sun model is disabled void setDirection(const glm::vec3& direction); + // AmbientTexture is unscriptable - it must be set through the zone entity + void setAmbientSphere(const gpu::SHPointer& sphere); + void resetAmbientSphere() { setAmbientSphere(nullptr); } + protected: model::SunSkyStagePointer _skyStage; };