From 38058512556e6786370668e46ceb0a8dc025282f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kapu=C5=9Bci=C5=84ski?= Date: Sat, 9 Jul 2022 12:23:50 +0200 Subject: [PATCH] Made recolor a separate material attribute and added more color types --- src/graphics/core/material.h | 3 + src/graphics/engine/engine.cpp | 145 +++++++++++++++++++----------- src/graphics/engine/engine.h | 34 ++----- src/graphics/model/model_gltf.cpp | 31 ++----- 4 files changed, 109 insertions(+), 104 deletions(-) diff --git a/src/graphics/core/material.h b/src/graphics/core/material.h index a112674a..712c0b9c 100644 --- a/src/graphics/core/material.h +++ b/src/graphics/core/material.h @@ -74,6 +74,8 @@ struct Material CullFace cullFace = CullFace::BACK; // Special tag std::string tag = ""; + // Recolor name + std::string recolor = ""; // Recolor reference color Color recolorReference = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -97,6 +99,7 @@ struct Material && alphaThreshold == other.alphaThreshold && cullFace == other.cullFace && tag == other.tag + && recolor == other.recolor && recolorReference == other.recolorReference && variableDetail == other.variableDetail && detailTexture == other.detailTexture; diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index c89ef5cf..aa32bd59 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -53,6 +53,7 @@ #include "graphics/model/model_shadow_spot.h" #include "level/robotmain.h" +#include "level/player_profile.h" #include "math/geometry.h" @@ -882,7 +883,7 @@ int CEngine::CreateObject() { if (! m_objects[objRank].used) { - m_objects[objRank].LoadDefault(); + m_objects[objRank] = {}; break; } } @@ -1150,7 +1151,7 @@ void CEngine::CreateShadowSpot(int objRank) { if (! m_shadowSpots[index].used) { - m_shadowSpots[index].LoadDefault(); + m_shadowSpots[index] = {}; break; } } @@ -1361,7 +1362,7 @@ int CEngine::CreateGroundSpot() { if (! m_groundSpots[index].used) { - m_groundSpots[index].LoadDefault(); + m_groundSpots[index] = {}; break; } } @@ -1422,7 +1423,7 @@ void CEngine::CreateGroundMark(glm::vec3 pos, float radius, float delay1, float delay2, float delay3, int dx, int dy, char* table) { - m_groundMark.LoadDefault(); + m_groundMark = {}; m_groundMark.draw = true; m_groundMark.phase = ENG_GR_MARK_PHASE_INC; @@ -1439,7 +1440,7 @@ void CEngine::CreateGroundMark(glm::vec3 pos, float radius, void CEngine::DeleteGroundMark(int rank) { - m_groundMark.LoadDefault(); + m_groundMark = {}; } void CEngine::ComputeDistance() @@ -2654,6 +2655,48 @@ bool CEngine::IsVisiblePoint(const glm::vec3 &pos) return glm::distance(m_eyePt, pos) <= (m_deepView[0] * m_clippingDistance); } +Color CEngine::GetObjectColor(int object, const std::string& name) +{ + if (name == "team") + { + return CRobotMain::GetInstance().GetTeamColor(m_objects[object].team); + } + else if (name == "vehicle") + { + return CRobotMain::GetInstance().GetVehicleColor(); + } + else if (name == "plant") + { + return CRobotMain::GetInstance().GetGreeneryColor(); + } + else if (name == "alien") + { + return CRobotMain::GetInstance().GetAlienColor(); + } + else if (name == "hair") + { + const auto& appearance = CRobotMain::GetInstance().GetPlayerProfile()->GetAppearance(); + + return appearance.colorHair; + } + else if (name == "suit") + { + const auto& appearance = CRobotMain::GetInstance().GetPlayerProfile()->GetAppearance(); + + return appearance.colorCombi; + } + else if (name == "band") + { + const auto& appearance = CRobotMain::GetInstance().GetPlayerProfile()->GetAppearance(); + + return appearance.colorBand; + } + else + { + return Color(1.0, 1.0, 1.0, 1.0); + } +} + void CEngine::ApplyChange() { SetFocus(m_focus); @@ -2941,54 +2984,27 @@ void CEngine::Draw3DScene() Color color = data.material.albedoColor; - bool recolor = false; - Color recolorFrom = {}; - Color recolorTo = {}; - float recolorTreshold = 0.0; + if (!data.material.tag.empty()) + { + Color c = GetObjectColor(objRank, data.material.tag); - if (data.material.tag == "team") - { - color = CRobotMain::GetInstance().GetTeamColor(m_objects[objRank].team); + if (c != Color(1.0, 1.0, 1.0, 1.0)) + { + color = c; + } } - else if (data.material.tag == "vehicle") + + if (data.material.recolor.empty()) { - color = CRobotMain::GetInstance().GetVehicleColor(); + objectRenderer->SetRecolor(false); } - else if (data.material.tag == "plant") + else { - color = CRobotMain::GetInstance().GetGreeneryColor(); - } - else if (data.material.tag == "alien") - { - color = CRobotMain::GetInstance().GetAlienColor(); - } - else if (data.material.tag == "recolor_team") - { - recolor = true; - recolorFrom = data.material.recolorReference; - recolorTo = CRobotMain::GetInstance().GetTeamColor(m_objects[objRank].team); - recolorTreshold = 0.1; - } - else if (data.material.tag == "recolor_vehicle") - { - recolor = true; - recolorFrom = data.material.recolorReference; - recolorTo = CRobotMain::GetInstance().GetVehicleColor(); - recolorTreshold = 0.1; - } - else if (data.material.tag == "recolor_plant") - { - recolor = true; - recolorFrom = data.material.recolorReference; - recolorTo = CRobotMain::GetInstance().GetGreeneryColor(); - recolorTreshold = 0.1; - } - else if (data.material.tag == "recolor_alien") - { - recolor = true; - recolorFrom = data.material.recolorReference; - recolorTo = CRobotMain::GetInstance().GetAlienColor(); - recolorTreshold = 0.1; + Color recolorFrom = data.material.recolorReference; + Color recolorTo = GetObjectColor(objRank, data.material.recolor); + float recolorThreshold = 0.1; + + objectRenderer->SetRecolor(true, recolorFrom, recolorTo, recolorThreshold); } objectRenderer->SetAlbedoColor(color); @@ -3001,8 +3017,6 @@ void CEngine::Draw3DScene() objectRenderer->SetMaterialParams(data.material.roughness, data.material.metalness, data.material.aoStrength); objectRenderer->SetMaterialTexture(data.materialTexture); - objectRenderer->SetRecolor(recolor, recolorFrom, recolorTo, recolorTreshold); - objectRenderer->SetCullFace(data.material.cullFace); objectRenderer->SetUVTransform(data.uvOffset, data.uvScale); objectRenderer->DrawObject(data.buffer); @@ -3647,8 +3661,9 @@ void CEngine::DrawInterface() renderer->SetProjectionMatrix(m_matProj); renderer->SetViewMatrix(m_matView); renderer->SetFog(fogStart, fogEnd, { fogColor.r, fogColor.g, fogColor.b }); - renderer->SetLighting(false); - renderer->SetLight(glm::vec4(1.0, 1.0, -1.0, 0.0), 1.0f, glm::vec3(1.0)); + renderer->SetLighting(true); + renderer->SetLight(glm::vec4(1.0, 1.0, -1.0, 0.0), 0.8f, glm::vec3(1.0)); + renderer->SetSky(Color(1.0, 1.0, 1.0), 0.2f); renderer->SetTransparency(TransparencyMode::NONE); renderer->SetAlphaScissor(0.0f); renderer->SetShadowParams(0, nullptr); @@ -3692,6 +3707,32 @@ void CEngine::DrawInterface() for (auto& data : p1.next) { + Color color = data.material.albedoColor; + + if (!data.material.tag.empty()) + { + Color c = GetObjectColor(objRank, data.material.tag); + + if (c != Color(1.0, 1.0, 1.0, 1.0)) + { + color = c; + } + } + + if (data.material.recolor.empty()) + { + renderer->SetRecolor(false); + } + else + { + Color recolorFrom = data.material.recolorReference; + Color recolorTo = GetObjectColor(objRank, data.material.recolor); + float recolorThreshold = 0.3; + + renderer->SetRecolor(true, recolorFrom, recolorTo, recolorThreshold); + } + + renderer->SetAlbedoColor(color); renderer->SetAlbedoTexture(data.albedoTexture); renderer->SetDetailTexture(data.detailTexture); diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 40cb8016..7a4d605a 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -131,7 +131,7 @@ struct EngineObject //! Type of object EngineObjectType type = ENG_OBJTYPE_NULL; //! Transformation matrix - glm::mat4 transform; + glm::mat4 transform = {}; //! Distance to object from eye point float distance = 0.0f; //! Rank of the associated shadow @@ -140,12 +140,6 @@ struct EngineObject bool ghost = false; //! Team int team = 0; - - //! Loads default values - inline void LoadDefault() - { - *this = EngineObject(); - } }; /** @@ -186,11 +180,6 @@ struct EngineShadow float intensity = 0.0f; //! Height from the ground float height = 0.0f; - - void LoadDefault() - { - *this = EngineShadow(); - } }; /** @@ -202,7 +191,7 @@ struct EngineGroundSpot //! If true, ground spot is valid bool used = false; //! Color of the shadow - Color color; + Color color = {}; //! Min altitude float min = 0.0f; //! Max altitude @@ -210,18 +199,13 @@ struct EngineGroundSpot //! Transition area float smooth = 0.0f; //! Position for the shadow - glm::vec3 pos{ 0, 0, 0 }; + glm::vec3 pos = { 0, 0, 0 }; //! Radius of the shadow float radius = 0.0f; //! Position of the shadow drawn - glm::vec3 drawPos{ 0, 0, 0 }; + glm::vec3 drawPos = { 0, 0, 0 }; //! Radius of the shadow drawn float drawRadius = 0.0f; - - void LoadDefault() - { - *this = EngineGroundSpot(); - } }; /** @@ -249,7 +233,7 @@ struct EngineGroundMark //! If true, draw mark bool draw = false; //! Phase of life - EngineGroundMarkPhase phase = ENG_GR_MARK_PHASE_NULL; + EngineGroundMarkPhase phase = ENG_GR_MARK_PHASE_NULL; //! Times for 3 life phases float delay[3] = {}; //! Fixed time @@ -272,11 +256,6 @@ struct EngineGroundMark int dy = 0; //! Pointer to the table char* table = nullptr; - - void LoadDefault() - { - *this = EngineGroundMark(); - } }; /** @@ -973,6 +952,9 @@ public: //! Indicates whether a point is visible bool IsVisiblePoint(const glm::vec3& pos); + //! Returns object material color + Color GetObjectColor(int object, const std::string& name); + //! Updates the scene after a change of parameters void ApplyChange(); diff --git a/src/graphics/model/model_gltf.cpp b/src/graphics/model/model_gltf.cpp index bc893818..b201b1f3 100644 --- a/src/graphics/model/model_gltf.cpp +++ b/src/graphics/model/model_gltf.cpp @@ -209,6 +209,11 @@ void GLTFLoader::ReadMaterials() mat.tag = extras["tag"].get(); } + if (extras.contains("recolor")) + { + mat.recolor = extras["recolor"].get(); + } + if (extras.contains("recolor_ref")) { const auto& color = extras["recolor_ref"]; @@ -218,33 +223,7 @@ void GLTFLoader::ReadMaterials() float b = color[2]; mat.recolorReference = Color(r, g, b); - } - if (extras.contains("energy")) - { - if (extras["energy"].get() != 0) - mat.tag = "energy"; - } - - if (extras.contains("tracker_1")) - { - if (extras["tracker_1"].get() != 0) - mat.tag = "tracker_right"; - } - - if (extras.contains("tracker_2")) - { - if (extras["tracker_2"].get() != 0) - mat.tag = "tracker_left"; - } - - if (extras.contains("transparency")) - { - if (extras["transparency"].get() != 0) - { - mat.alphaMode = AlphaMode::MASK; - mat.alphaThreshold = 0.5f; - } } }