From 640cde1653fc2d342e8d37357506d6b50ce12121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kapu=C5=9Bci=C5=84ski?= Date: Thu, 7 Apr 2022 01:11:23 +0200 Subject: [PATCH] Various improvements and fixes * Added strength parameter for ambient occlusion * Added proper support for material and emissive textures * Added team-based recoloring, uses "team" tag * Changed shadow ranges to make close-up shadows much better * Fixed background coloring * Added proper defaulting for glTF values * Fixed parsing of emissive values * Added normalization of normals in vertex shaders of object and terrain renderers --- src/graphics/core/material.h | 2 + src/graphics/core/renderers.h | 4 +- src/graphics/engine/engine.cpp | 79 ++++++++++++--- src/graphics/engine/engine.h | 8 ++ src/graphics/engine/oldmodelmanager.cpp | 34 ++++--- src/graphics/engine/oldmodelmanager.h | 10 +- src/graphics/model/model_gltf.cpp | 97 ++++++++++++++++--- src/graphics/opengl/gl33objectrenderer.cpp | 7 +- src/graphics/opengl/gl33objectrenderer.h | 3 +- src/graphics/opengl/gl33renderers.cpp | 4 +- src/graphics/opengl/gl33renderers.h | 3 +- .../opengl/shaders/gl33/object_fs.glsl | 3 +- .../opengl/shaders/gl33/object_vs.glsl | 2 +- .../opengl/shaders/gl33/terrain_fs.glsl | 3 +- .../opengl/shaders/gl33/terrain_vs.glsl | 2 +- src/level/robotmain.cpp | 2 + 16 files changed, 203 insertions(+), 60 deletions(-) diff --git a/src/graphics/core/material.h b/src/graphics/core/material.h index 8b570bd3..03f9ea18 100644 --- a/src/graphics/core/material.h +++ b/src/graphics/core/material.h @@ -56,6 +56,8 @@ struct Material float roughness = 1.0; //! Metalness float metalness = 0.0; + //! AO strength + float aoStrength = 0.0; //! AO-roughness-metalness texture std::string materialTexture = ""; //! Emissive color diff --git a/src/graphics/core/renderers.h b/src/graphics/core/renderers.h index 3fe169ce..a50b64bd 100644 --- a/src/graphics/core/renderers.h +++ b/src/graphics/core/renderers.h @@ -110,7 +110,7 @@ public: //! Sets emissive texture virtual void SetEmissiveTexture(const Texture& texture) = 0; //! Sets material parameters - virtual void SetMaterialParams(float roughness, float metalness) = 0; + virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) = 0; //! Sets material texture virtual void SetMaterialTexture(const Texture& texture) = 0; @@ -162,7 +162,7 @@ public: //! Sets emissive texture virtual void SetEmissiveTexture(const Texture& texture) = 0; //! Sets material parameters - virtual void SetMaterialParams(float roughness, float metalness) = 0; + virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) = 0; //! Sets material texture virtual void SetMaterialTexture(const Texture& texture) = 0; diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 4420ea81..d5122ecb 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -963,6 +963,13 @@ void CEngine::SetObjectDrawWorld(int objRank, bool draw) m_objects[objRank].drawWorld = draw; } +void CEngine::SetObjectTeam(int objRank, int team) +{ + assert(objRank >= 0 && objRank < static_cast(m_objects.size())); + + m_objects[objRank].team = team; +} + void CEngine::SetObjectDrawFront(int objRank, bool draw) { assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); @@ -1977,6 +1984,28 @@ bool CEngine::LoadAllTextures() if (!data.detailTexture.Valid()) ok = false; } + + if (!data.material.materialTexture.empty()) + { + if (terrain) + data.materialTexture = LoadTexture("textures/" + data.material.materialTexture, m_terrainTexParams); + else + data.materialTexture = LoadTexture("textures/" + data.material.materialTexture); + + if (!data.materialTexture.Valid()) + ok = false; + } + + if (!data.material.emissiveTexture.empty()) + { + if (terrain) + data.emissiveTexture = LoadTexture("textures/" + data.material.emissiveTexture, m_terrainTexParams); + else + data.emissiveTexture = LoadTexture("textures/" + data.material.emissiveTexture); + + if (!data.emissiveTexture.Valid()) + ok = false; + } } } @@ -2323,6 +2352,11 @@ void CEngine::SetOverColor(const Color& color, TransparencyMode mode) m_overMode = mode; } +void CEngine::SetTeamColor(int team, const Color& color) +{ + m_teamColors[team] = color; +} + void CEngine::SetParticleDensity(float value) { if (value < 0.0f) value = 0.0f; @@ -2798,7 +2832,7 @@ void CEngine::Draw3DScene() terrainRenderer->SetEmissiveColor(data.material.emissiveColor); terrainRenderer->SetEmissiveTexture(data.emissiveTexture); - terrainRenderer->SetMaterialParams(data.material.roughness, data.material.metalness); + terrainRenderer->SetMaterialParams(data.material.roughness, data.material.metalness, data.material.aoStrength); terrainRenderer->SetMaterialTexture(data.materialTexture); terrainRenderer->DrawObject(m_objects[objRank].transform, data.buffer); @@ -2888,14 +2922,21 @@ void CEngine::Draw3DScene() objectRenderer->SetAlphaScissor(0.0f); } - objectRenderer->SetAlbedoColor(data.material.albedoColor); + Color recolor = Color(1.0, 1.0, 1.0, 1.0); + + if (data.material.tag == "team") + { + recolor = m_teamColors[m_objects[objRank].team]; + } + + objectRenderer->SetAlbedoColor(data.material.albedoColor * recolor); objectRenderer->SetAlbedoTexture(data.albedoTexture); objectRenderer->SetDetailTexture(data.detailTexture); objectRenderer->SetEmissiveColor(data.material.emissiveColor); objectRenderer->SetEmissiveTexture(data.emissiveTexture); - objectRenderer->SetMaterialParams(data.material.roughness, data.material.metalness); + objectRenderer->SetMaterialParams(data.material.roughness, data.material.metalness, data.material.aoStrength); objectRenderer->SetMaterialTexture(data.materialTexture); objectRenderer->SetCullFace(data.material.cullFace); @@ -3289,11 +3330,11 @@ void CEngine::RenderShadowMap() m_shadowRegions = 4; - m_shadowParams[0].range = 32.0; + m_shadowParams[0].range = 16.0; m_shadowParams[0].offset = { 0.0, 0.0 }; m_shadowParams[0].scale = { 0.5, 0.5 }; - m_shadowParams[1].range = 96.0; + m_shadowParams[1].range = 64.0; m_shadowParams[1].offset = { 0.5, 0.0 }; m_shadowParams[1].scale = { 0.5, 0.5 }; @@ -4150,22 +4191,19 @@ void CEngine::DrawBackgroundGradient(const Color& up, const Color& down) glm::vec2 p1(0.0f, 0.0f); glm::vec2 p2(1.0f, 1.0f); - glm::u8vec4 color[3] = - { - { up.r, up.g, up.b, up.a }, - { down.r, down.g, down.b, down.a }, - { 0, 0, 0, 0 } - }; + auto up_int = ColorToIntColor(up); + auto down_int = ColorToIntColor(down); auto renderer = m_device->GetUIRenderer(); renderer->SetTexture(Texture{}); + renderer->SetColor({ 1, 1, 1, 1 }); renderer->SetTransparency(TransparencyMode::NONE); auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4); - vertices[0] = { { p1.x, p1.y }, {}, color[1] }; - vertices[1] = { { p1.x, p2.y }, {}, color[0] }; - vertices[2] = { { p2.x, p1.y }, {}, color[1] }; - vertices[3] = { { p2.x, p2.y }, {}, color[0] }; + vertices[0] = { { p1.x, p1.y }, {}, down_int }; + vertices[1] = { { p1.x, p2.y }, {}, up_int }; + vertices[2] = { { p2.x, p1.y }, {}, down_int }; + vertices[3] = { { p2.x, p2.y }, {}, up_int }; renderer->EndPrimitive(); AddStatisticTriangle(2); @@ -4238,6 +4276,7 @@ void CEngine::DrawBackgroundImage() } auto renderer = m_device->GetUIRenderer(); + renderer->SetColor({ 1, 1, 1, 1 }); renderer->SetTexture(m_backgroundTex); renderer->SetTransparency(TransparencyMode::NONE); auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4); @@ -4602,7 +4641,15 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector m_groundSpots; //! Ground mark EngineGroundMark m_groundMark; + //! Team colors + std::map m_teamColors; //! Location of camera glm::vec3 m_eyePt{ 0, 0, 0 }; diff --git a/src/graphics/engine/oldmodelmanager.cpp b/src/graphics/engine/oldmodelmanager.cpp index dfa0bb11..d293c10c 100644 --- a/src/graphics/engine/oldmodelmanager.cpp +++ b/src/graphics/engine/oldmodelmanager.cpp @@ -46,7 +46,7 @@ COldModelManager::~COldModelManager() { } -bool COldModelManager::LoadModel(const std::string& name, bool mirrored, int variant) +bool COldModelManager::LoadModel(const std::string& name, bool mirrored, int team) { CModel model; try @@ -108,7 +108,7 @@ skip: if (mirrored) Mirror(modelInfo.triangles); - FileInfo fileInfo(name, mirrored, variant); + FileInfo fileInfo(name, mirrored, team); m_models[fileInfo] = modelInfo; m_engine->AddBaseObjTriangles(modelInfo.baseObjRank, modelInfo.triangles); @@ -116,50 +116,52 @@ skip: return true; } -bool COldModelManager::AddModelReference(const std::string& fileName, bool mirrored, int objRank, int variant) +bool COldModelManager::AddModelReference(const std::string& fileName, bool mirrored, int objRank, int team) { - auto it = m_models.find(FileInfo(fileName, mirrored, variant)); + auto it = m_models.find(FileInfo(fileName, mirrored, team)); if (it == m_models.end()) { - if (!LoadModel(fileName, mirrored, variant)) + if (!LoadModel(fileName, mirrored, team)) return false; - it = m_models.find(FileInfo(fileName, mirrored, variant)); + it = m_models.find(FileInfo(fileName, mirrored, team)); } m_engine->SetObjectBaseRank(objRank, (*it).second.baseObjRank); + m_engine->SetObjectTeam(objRank, team); return true; } -bool COldModelManager::AddModelCopy(const std::string& fileName, bool mirrored, int objRank, int variant) +bool COldModelManager::AddModelCopy(const std::string& fileName, bool mirrored, int objRank, int team) { - auto it = m_models.find(FileInfo(fileName, mirrored, variant)); + auto it = m_models.find(FileInfo(fileName, mirrored, team)); if (it == m_models.end()) { - if (!LoadModel(fileName, mirrored, variant)) + if (!LoadModel(fileName, mirrored, team)) return false; - it = m_models.find(FileInfo(fileName, mirrored, variant)); + it = m_models.find(FileInfo(fileName, mirrored, team)); } int copyBaseObjRank = m_engine->CreateBaseObject(); m_engine->CopyBaseObject((*it).second.baseObjRank, copyBaseObjRank); m_engine->SetObjectBaseRank(objRank, copyBaseObjRank); + m_engine->SetObjectTeam(objRank, team); m_copiesBaseRanks.push_back(copyBaseObjRank); return true; } -bool COldModelManager::IsModelLoaded(const std::string& fileName, bool mirrored, int variant) +bool COldModelManager::IsModelLoaded(const std::string& fileName, bool mirrored, int team) { - return m_models.count(FileInfo(fileName, mirrored, variant)) > 0; + return m_models.count(FileInfo(fileName, mirrored, team)) > 0; } -int COldModelManager::GetModelBaseObjRank(const std::string& fileName, bool mirrored, int variant) +int COldModelManager::GetModelBaseObjRank(const std::string& fileName, bool mirrored, int team) { - auto it = m_models.find(FileInfo(fileName, mirrored, variant)); + auto it = m_models.find(FileInfo(fileName, mirrored, team)); if (it == m_models.end()) return -1; @@ -176,9 +178,9 @@ void COldModelManager::DeleteAllModelCopies() m_copiesBaseRanks.clear(); } -void COldModelManager::UnloadModel(const std::string& fileName, bool mirrored, int variant) +void COldModelManager::UnloadModel(const std::string& fileName, bool mirrored, int team) { - auto it = m_models.find(FileInfo(fileName, mirrored, variant)); + auto it = m_models.find(FileInfo(fileName, mirrored, team)); if (it == m_models.end()) return; diff --git a/src/graphics/engine/oldmodelmanager.h b/src/graphics/engine/oldmodelmanager.h index 2be58414..f6aed052 100644 --- a/src/graphics/engine/oldmodelmanager.h +++ b/src/graphics/engine/oldmodelmanager.h @@ -58,19 +58,19 @@ public: ~COldModelManager(); //! Loads a model from given file - bool LoadModel(const std::string& fileName, bool mirrored, int variant = 0); + bool LoadModel(const std::string& fileName, bool mirrored, int team = 0); //! Adds an instance of model to the given object rank as a reference to base object - bool AddModelReference(const std::string& fileName, bool mirrored, int objRank, int variant = 0); + bool AddModelReference(const std::string& fileName, bool mirrored, int objRank, int team = 0); //! Adds an instance of model to the given object rank as a copy (copied base object) - bool AddModelCopy(const std::string& fileName, bool mirrored, int objRank, int variant = 0); + bool AddModelCopy(const std::string& fileName, bool mirrored, int objRank, int team = 0); //! Returns true if given model is loaded - bool IsModelLoaded(const std::string& fileName, bool mirrored, int variant = 0); + bool IsModelLoaded(const std::string& fileName, bool mirrored, int team = 0); //! Returns the rank of base engine object of given loaded model - int GetModelBaseObjRank(const std::string& fileName, bool mirrored, int variant = 0); + int GetModelBaseObjRank(const std::string& fileName, bool mirrored, int team = 0); //! Deletes all copied objects void DeleteAllModelCopies(); diff --git a/src/graphics/model/model_gltf.cpp b/src/graphics/model/model_gltf.cpp index b60e6797..1806e113 100644 --- a/src/graphics/model/model_gltf.cpp +++ b/src/graphics/model/model_gltf.cpp @@ -237,6 +237,38 @@ void GLTFLoader::ReadMaterials() } } + if (material.contains("emissiveFactor")) + { + const auto& color = material["emissiveFactor"]; + + mat.emissiveColor = { + color[0].get(), + color[1].get(), + color[2].get(), + 0.0 + }; + } + else + { + mat.emissiveColor = { 0.0, 0.0, 0.0, 0.0 }; + } + + if (material.contains("emissiveTexture")) + { + const auto& tex = material["emissiveTexture"]; + + if (tex.contains("index")) + { + int index = tex["index"].get(); + + const auto& texture = m_textures[index]; + + const auto& image = m_images[texture.source]; + + mat.emissiveTexture = image.uri; + } + } + if (material.contains("pbrMetallicRoughness")) { const auto& pbr = material["pbrMetallicRoughness"]; @@ -252,6 +284,10 @@ void GLTFLoader::ReadMaterials() color[3].get() }; } + else + { + mat.albedoColor = { 1.0, 1.0, 1.0, 1.0 }; + } if (pbr.contains("baseColorTexture")) { @@ -273,27 +309,23 @@ void GLTFLoader::ReadMaterials() { mat.metalness = pbr["metallicFactor"].get(); } + else + { + mat.metalness = 1.0; + } if (pbr.contains("roughnessFactor")) { mat.roughness = pbr["roughnessFactor"].get(); } - - if (pbr.contains("emissiveFactor")) + else { - const auto& color = pbr["emissiveFactor"]; - - mat.emissiveColor = { - color[0].get(), - color[1].get(), - color[2].get(), - 0.0 - }; + mat.roughness = 1.0; } - if (pbr.contains("emissiveTextue")) + if (pbr.contains("metallicRoughnessTexture")) { - const auto& tex = pbr["emissiveTextue"]; + const auto& tex = pbr["metallicRoughnessTexture"]; if (tex.contains("index")) { @@ -303,9 +335,48 @@ void GLTFLoader::ReadMaterials() const auto& image = m_images[texture.source]; - mat.emissiveTexture = image.uri; + mat.materialTexture = image.uri; } } + + if (pbr.contains("occlusionTexture")) + { + const auto& tex = pbr["occlusionTexture"]; + + if (tex.contains("index")) + { + int index = tex["index"].get(); + + const auto& texture = m_textures[index]; + + const auto& image = m_images[texture.source]; + + if (tex.contains("strength")) + { + mat.aoStrength = tex["strength"].get(); + } + else + { + mat.aoStrength = 1.0f; + } + } + } + } + + if (material.contains("normalTexture")) + { + const auto& tex = material["normalTexture"]; + + if (tex.contains("index")) + { + int index = tex["index"].get(); + + const auto& texture = m_textures[index]; + + const auto& image = m_images[texture.source]; + + mat.normalTexture = image.uri; + } } if (material.contains("alphaMode")) diff --git a/src/graphics/opengl/gl33objectrenderer.cpp b/src/graphics/opengl/gl33objectrenderer.cpp index d46e0afe..2280d64e 100644 --- a/src/graphics/opengl/gl33objectrenderer.cpp +++ b/src/graphics/opengl/gl33objectrenderer.cpp @@ -92,6 +92,7 @@ CGL33ObjectRenderer::CGL33ObjectRenderer(CGL33Device* device) m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor"); m_roughness = glGetUniformLocation(m_program, "uni_Roughness"); m_metalness = glGetUniformLocation(m_program, "uni_Metalness"); + m_aoStrength = glGetUniformLocation(m_program, "uni_AOStrength"); m_triplanarMode = glGetUniformLocation(m_program, "uni_TriplanarMode"); m_triplanarScale = glGetUniformLocation(m_program, "uni_TriplanarScale"); @@ -207,6 +208,9 @@ void CGL33ObjectRenderer::CGL33ObjectRenderer::Begin() SetUVTransform({ 0.0f, 0.0f }, { 1.0f, 1.0f }); SetAlphaScissor(0.0f); SetFog(1e+6f, 1e+6, {}); + SetEmissiveColor({ 0, 0, 0, 0 }); + SetAlbedoColor({ 1, 1, 1, 1 }); + SetMaterialParams(1.0, 0.0, 0.0); } void CGL33ObjectRenderer::CGL33ObjectRenderer::End() @@ -297,10 +301,11 @@ void CGL33ObjectRenderer::SetEmissiveTexture(const Texture& texture) glBindTexture(GL_TEXTURE_2D, texture.id); } -void CGL33ObjectRenderer::SetMaterialParams(float roughness, float metalness) +void CGL33ObjectRenderer::SetMaterialParams(float roughness, float metalness, float aoStrength) { glUniform1f(m_roughness, roughness); glUniform1f(m_metalness, metalness); + glUniform1f(m_aoStrength, aoStrength); } void CGL33ObjectRenderer::SetMaterialTexture(const Texture& texture) diff --git a/src/graphics/opengl/gl33objectrenderer.h b/src/graphics/opengl/gl33objectrenderer.h index 37d15b72..da16c220 100644 --- a/src/graphics/opengl/gl33objectrenderer.h +++ b/src/graphics/opengl/gl33objectrenderer.h @@ -63,7 +63,7 @@ public: //! Sets emissive texture virtual void SetEmissiveTexture(const Texture& texture) override; //! Sets material parameters - virtual void SetMaterialParams(float roughness, float metalness) override; + virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) override; //! Sets material texture virtual void SetMaterialTexture(const Texture& texture) override; @@ -135,6 +135,7 @@ private: GLint m_emissiveColor = -1; GLint m_roughness = -1; GLint m_metalness = -1; + GLint m_aoStrength = -1; GLint m_triplanarMode = -1; GLint m_triplanarScale = -1; diff --git a/src/graphics/opengl/gl33renderers.cpp b/src/graphics/opengl/gl33renderers.cpp index b8b18df3..44472120 100644 --- a/src/graphics/opengl/gl33renderers.cpp +++ b/src/graphics/opengl/gl33renderers.cpp @@ -335,6 +335,7 @@ CGL33TerrainRenderer::CGL33TerrainRenderer(CGL33Device* device) m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor"); m_roughness = glGetUniformLocation(m_program, "uni_Roughness"); m_metalness = glGetUniformLocation(m_program, "uni_Metalness"); + m_aoStrength = glGetUniformLocation(m_program, "uni_AOStrength"); m_shadowRegions = glGetUniformLocation(m_program, "uni_ShadowRegions"); @@ -520,10 +521,11 @@ void CGL33TerrainRenderer::SetEmissiveTexture(const Texture& texture) glBindTexture(GL_TEXTURE_2D, texture.id); } -void CGL33TerrainRenderer::SetMaterialParams(float roughness, float metalness) +void CGL33TerrainRenderer::SetMaterialParams(float roughness, float metalness, float aoStrength) { glUniform1f(m_roughness, roughness); glUniform1f(m_metalness, metalness); + glUniform1f(m_aoStrength, aoStrength); } void CGL33TerrainRenderer::SetMaterialTexture(const Texture& texture) diff --git a/src/graphics/opengl/gl33renderers.h b/src/graphics/opengl/gl33renderers.h index 5bed93fc..06448156 100644 --- a/src/graphics/opengl/gl33renderers.h +++ b/src/graphics/opengl/gl33renderers.h @@ -135,7 +135,7 @@ public: //! Sets emissive texture virtual void SetEmissiveTexture(const Texture& texture) override; //! Sets material parameters - virtual void SetMaterialParams(float roughness, float metalness) override; + virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) override; //! Sets material texture virtual void SetMaterialTexture(const Texture& texture) override; @@ -182,6 +182,7 @@ private: GLint m_emissiveColor = -1; GLint m_roughness = -1; GLint m_metalness = -1; + GLint m_aoStrength = -1; struct ShadowUniforms { diff --git a/src/graphics/opengl/shaders/gl33/object_fs.glsl b/src/graphics/opengl/shaders/gl33/object_fs.glsl index 95ca4209..ee184b84 100644 --- a/src/graphics/opengl/shaders/gl33/object_fs.glsl +++ b/src/graphics/opengl/shaders/gl33/object_fs.glsl @@ -28,6 +28,7 @@ uniform sampler2D uni_DetailTexture; uniform float uni_Roughness; uniform float uni_Metalness; +uniform float uni_AOStrength; uniform sampler2D uni_MaterialTexture; uniform vec3 uni_EmissiveColor; @@ -97,7 +98,7 @@ void main() vec3 params = texture(uni_MaterialTexture, data.TexCoord0).xyz; - float ambientOcclusion = params.r; + float ambientOcclusion = 1.0 + uni_AOStrength * (params.r - 1.0); float roughness = uni_Roughness * params.g; float metalness = uni_Metalness * params.b; diff --git a/src/graphics/opengl/shaders/gl33/object_vs.glsl b/src/graphics/opengl/shaders/gl33/object_vs.glsl index b21d81a7..949167c3 100644 --- a/src/graphics/opengl/shaders/gl33/object_vs.glsl +++ b/src/graphics/opengl/shaders/gl33/object_vs.glsl @@ -54,7 +54,7 @@ void main() data.Color = in_Color; data.TexCoord0 = in_TexCoord0 * uni_UVScale + uni_UVOffset; data.TexCoord1 = in_TexCoord1; - data.Normal = mat3(uni_NormalMatrix) * in_Normal; + data.Normal = normalize(mat3(uni_NormalMatrix) * in_Normal); data.VertexCoord = in_VertexCoord.xyz; data.VertexNormal = in_Normal; data.Position = position.xyz; diff --git a/src/graphics/opengl/shaders/gl33/terrain_fs.glsl b/src/graphics/opengl/shaders/gl33/terrain_fs.glsl index 59ec61e2..1b89e786 100644 --- a/src/graphics/opengl/shaders/gl33/terrain_fs.glsl +++ b/src/graphics/opengl/shaders/gl33/terrain_fs.glsl @@ -28,6 +28,7 @@ uniform sampler2D uni_DetailTexture; uniform float uni_Roughness; uniform float uni_Metalness; +uniform float uni_AOStrength; uniform sampler2D uni_MaterialTexture; uniform vec3 uni_EmissiveColor; @@ -65,7 +66,7 @@ void main() vec3 params = texture(uni_MaterialTexture, data.TexCoord0).xyz; - float ambientOcclusion = params.r; + float ambientOcclusion = 1.0 + uni_AOStrength * (params.r - 1.0); float roughness = uni_Roughness * params.g; float metalness = uni_Metalness * params.b; diff --git a/src/graphics/opengl/shaders/gl33/terrain_vs.glsl b/src/graphics/opengl/shaders/gl33/terrain_vs.glsl index e49de0e3..4c364b45 100644 --- a/src/graphics/opengl/shaders/gl33/terrain_vs.glsl +++ b/src/graphics/opengl/shaders/gl33/terrain_vs.glsl @@ -49,7 +49,7 @@ void main() data.Color = in_Color; data.TexCoord0 = in_TexCoord0; data.TexCoord1 = in_TexCoord1; - data.Normal = mat3(uni_NormalMatrix) * in_Normal; + data.Normal = normalize(mat3(uni_NormalMatrix) * in_Normal); //data.Distance = abs(eyeSpace.z); data.Position = position.xyz; data.ShadowCoords = ProjectShadows(position.xyz); diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 2ae7956b..b8470241 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -4039,6 +4039,8 @@ void CRobotMain::ChangeColor() std::string teamStr = StrUtils::ToString(team); if(team == 0) teamStr = ""; + m_engine->SetTeamColor(team, newColor); + //m_engine->ChangeTextureColor("textures/objects/base1.png"+teamStr, "textures/objects/base1.png", COLOR_REF_BOT, newColor, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, nullptr, 0, true); //m_engine->ChangeTextureColor("textures/objects/convert.png"+teamStr, "textures/objects/convert.png", COLOR_REF_BOT, newColor, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, nullptr, 0, true); //m_engine->ChangeTextureColor("textures/objects/derrick.png"+teamStr, "textures/objects/derrick.png", COLOR_REF_BOT, newColor, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, nullptr, 0, true);