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 renderersdev
parent
4b1b1763df
commit
640cde1653
|
@ -56,6 +56,8 @@ struct Material
|
||||||
float roughness = 1.0;
|
float roughness = 1.0;
|
||||||
//! Metalness
|
//! Metalness
|
||||||
float metalness = 0.0;
|
float metalness = 0.0;
|
||||||
|
//! AO strength
|
||||||
|
float aoStrength = 0.0;
|
||||||
//! AO-roughness-metalness texture
|
//! AO-roughness-metalness texture
|
||||||
std::string materialTexture = "";
|
std::string materialTexture = "";
|
||||||
//! Emissive color
|
//! Emissive color
|
||||||
|
|
|
@ -110,7 +110,7 @@ public:
|
||||||
//! Sets emissive texture
|
//! Sets emissive texture
|
||||||
virtual void SetEmissiveTexture(const Texture& texture) = 0;
|
virtual void SetEmissiveTexture(const Texture& texture) = 0;
|
||||||
//! Sets material parameters
|
//! Sets material parameters
|
||||||
virtual void SetMaterialParams(float roughness, float metalness) = 0;
|
virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) = 0;
|
||||||
//! Sets material texture
|
//! Sets material texture
|
||||||
virtual void SetMaterialTexture(const Texture& texture) = 0;
|
virtual void SetMaterialTexture(const Texture& texture) = 0;
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ public:
|
||||||
//! Sets emissive texture
|
//! Sets emissive texture
|
||||||
virtual void SetEmissiveTexture(const Texture& texture) = 0;
|
virtual void SetEmissiveTexture(const Texture& texture) = 0;
|
||||||
//! Sets material parameters
|
//! Sets material parameters
|
||||||
virtual void SetMaterialParams(float roughness, float metalness) = 0;
|
virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) = 0;
|
||||||
//! Sets material texture
|
//! Sets material texture
|
||||||
virtual void SetMaterialTexture(const Texture& texture) = 0;
|
virtual void SetMaterialTexture(const Texture& texture) = 0;
|
||||||
|
|
||||||
|
|
|
@ -963,6 +963,13 @@ void CEngine::SetObjectDrawWorld(int objRank, bool draw)
|
||||||
m_objects[objRank].drawWorld = draw;
|
m_objects[objRank].drawWorld = draw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEngine::SetObjectTeam(int objRank, int team)
|
||||||
|
{
|
||||||
|
assert(objRank >= 0 && objRank < static_cast<int>(m_objects.size()));
|
||||||
|
|
||||||
|
m_objects[objRank].team = team;
|
||||||
|
}
|
||||||
|
|
||||||
void CEngine::SetObjectDrawFront(int objRank, bool draw)
|
void CEngine::SetObjectDrawFront(int objRank, bool draw)
|
||||||
{
|
{
|
||||||
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
||||||
|
@ -1977,6 +1984,28 @@ bool CEngine::LoadAllTextures()
|
||||||
if (!data.detailTexture.Valid())
|
if (!data.detailTexture.Valid())
|
||||||
ok = false;
|
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;
|
m_overMode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEngine::SetTeamColor(int team, const Color& color)
|
||||||
|
{
|
||||||
|
m_teamColors[team] = color;
|
||||||
|
}
|
||||||
|
|
||||||
void CEngine::SetParticleDensity(float value)
|
void CEngine::SetParticleDensity(float value)
|
||||||
{
|
{
|
||||||
if (value < 0.0f) value = 0.0f;
|
if (value < 0.0f) value = 0.0f;
|
||||||
|
@ -2798,7 +2832,7 @@ void CEngine::Draw3DScene()
|
||||||
terrainRenderer->SetEmissiveColor(data.material.emissiveColor);
|
terrainRenderer->SetEmissiveColor(data.material.emissiveColor);
|
||||||
terrainRenderer->SetEmissiveTexture(data.emissiveTexture);
|
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->SetMaterialTexture(data.materialTexture);
|
||||||
|
|
||||||
terrainRenderer->DrawObject(m_objects[objRank].transform, data.buffer);
|
terrainRenderer->DrawObject(m_objects[objRank].transform, data.buffer);
|
||||||
|
@ -2888,14 +2922,21 @@ void CEngine::Draw3DScene()
|
||||||
objectRenderer->SetAlphaScissor(0.0f);
|
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->SetAlbedoTexture(data.albedoTexture);
|
||||||
objectRenderer->SetDetailTexture(data.detailTexture);
|
objectRenderer->SetDetailTexture(data.detailTexture);
|
||||||
|
|
||||||
objectRenderer->SetEmissiveColor(data.material.emissiveColor);
|
objectRenderer->SetEmissiveColor(data.material.emissiveColor);
|
||||||
objectRenderer->SetEmissiveTexture(data.emissiveTexture);
|
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->SetMaterialTexture(data.materialTexture);
|
||||||
|
|
||||||
objectRenderer->SetCullFace(data.material.cullFace);
|
objectRenderer->SetCullFace(data.material.cullFace);
|
||||||
|
@ -3289,11 +3330,11 @@ void CEngine::RenderShadowMap()
|
||||||
|
|
||||||
m_shadowRegions = 4;
|
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].offset = { 0.0, 0.0 };
|
||||||
m_shadowParams[0].scale = { 0.5, 0.5 };
|
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].offset = { 0.5, 0.0 };
|
||||||
m_shadowParams[1].scale = { 0.5, 0.5 };
|
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 p1(0.0f, 0.0f);
|
||||||
glm::vec2 p2(1.0f, 1.0f);
|
glm::vec2 p2(1.0f, 1.0f);
|
||||||
|
|
||||||
glm::u8vec4 color[3] =
|
auto up_int = ColorToIntColor(up);
|
||||||
{
|
auto down_int = ColorToIntColor(down);
|
||||||
{ up.r, up.g, up.b, up.a },
|
|
||||||
{ down.r, down.g, down.b, down.a },
|
|
||||||
{ 0, 0, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
auto renderer = m_device->GetUIRenderer();
|
auto renderer = m_device->GetUIRenderer();
|
||||||
renderer->SetTexture(Texture{});
|
renderer->SetTexture(Texture{});
|
||||||
|
renderer->SetColor({ 1, 1, 1, 1 });
|
||||||
renderer->SetTransparency(TransparencyMode::NONE);
|
renderer->SetTransparency(TransparencyMode::NONE);
|
||||||
auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4);
|
auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4);
|
||||||
|
|
||||||
vertices[0] = { { p1.x, p1.y }, {}, color[1] };
|
vertices[0] = { { p1.x, p1.y }, {}, down_int };
|
||||||
vertices[1] = { { p1.x, p2.y }, {}, color[0] };
|
vertices[1] = { { p1.x, p2.y }, {}, up_int };
|
||||||
vertices[2] = { { p2.x, p1.y }, {}, color[1] };
|
vertices[2] = { { p2.x, p1.y }, {}, down_int };
|
||||||
vertices[3] = { { p2.x, p2.y }, {}, color[0] };
|
vertices[3] = { { p2.x, p2.y }, {}, up_int };
|
||||||
|
|
||||||
renderer->EndPrimitive();
|
renderer->EndPrimitive();
|
||||||
AddStatisticTriangle(2);
|
AddStatisticTriangle(2);
|
||||||
|
@ -4238,6 +4276,7 @@ void CEngine::DrawBackgroundImage()
|
||||||
}
|
}
|
||||||
|
|
||||||
auto renderer = m_device->GetUIRenderer();
|
auto renderer = m_device->GetUIRenderer();
|
||||||
|
renderer->SetColor({ 1, 1, 1, 1 });
|
||||||
renderer->SetTexture(m_backgroundTex);
|
renderer->SetTexture(m_backgroundTex);
|
||||||
renderer->SetTransparency(TransparencyMode::NONE);
|
renderer->SetTransparency(TransparencyMode::NONE);
|
||||||
auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4);
|
auto vertices = renderer->BeginPrimitive(PrimitiveType::TRIANGLE_STRIP, 4);
|
||||||
|
@ -4602,7 +4641,15 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
|
||||||
vertices[2] = triangle.p3;
|
vertices[2] = triangle.p3;
|
||||||
|
|
||||||
Material material = triangle.material;
|
Material material = triangle.material;
|
||||||
material.albedoTexture = "objects/" + material.albedoTexture;
|
|
||||||
|
if (!material.albedoTexture.empty())
|
||||||
|
material.albedoTexture = "objects/" + material.albedoTexture;
|
||||||
|
|
||||||
|
if (!material.materialTexture.empty())
|
||||||
|
material.materialTexture = "objects/" + material.materialTexture;
|
||||||
|
|
||||||
|
if (!material.emissiveTexture.empty())
|
||||||
|
material.emissiveTexture = "objects/" + material.emissiveTexture;
|
||||||
|
|
||||||
if (material.variableDetail)
|
if (material.variableDetail)
|
||||||
material.detailTexture = GetSecondTexture();
|
material.detailTexture = GetSecondTexture();
|
||||||
|
|
|
@ -136,6 +136,8 @@ struct EngineObject
|
||||||
int shadowRank = -1;
|
int shadowRank = -1;
|
||||||
//! Ghost mode
|
//! Ghost mode
|
||||||
bool ghost = false;
|
bool ghost = false;
|
||||||
|
//! Team
|
||||||
|
int team = 0;
|
||||||
|
|
||||||
//! Loads default values
|
//! Loads default values
|
||||||
inline void LoadDefault()
|
inline void LoadDefault()
|
||||||
|
@ -615,6 +617,8 @@ public:
|
||||||
|
|
||||||
//! Sets the transparency level for given object
|
//! Sets the transparency level for given object
|
||||||
void SetObjectGhostMode(int objRank, bool enabled);
|
void SetObjectGhostMode(int objRank, bool enabled);
|
||||||
|
//! Sets team for given object
|
||||||
|
void SetObjectTeam(int objRank, int team);
|
||||||
|
|
||||||
//! Returns the bounding box for an object
|
//! Returns the bounding box for an object
|
||||||
void GetObjectBBox(int objRank, glm::vec3& min, glm::vec3& max);
|
void GetObjectBBox(int objRank, glm::vec3& min, glm::vec3& max);
|
||||||
|
@ -817,6 +821,8 @@ public:
|
||||||
void SetOverFront(bool front);
|
void SetOverFront(bool front);
|
||||||
//! Sets the foreground overlay color
|
//! Sets the foreground overlay color
|
||||||
void SetOverColor(const Color& color, TransparencyMode mode);
|
void SetOverColor(const Color& color, TransparencyMode mode);
|
||||||
|
//! Sets color for a team
|
||||||
|
void SetTeamColor(int team, const Color& color);
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
//! Management of the particle density
|
//! Management of the particle density
|
||||||
|
@ -1156,6 +1162,8 @@ protected:
|
||||||
std::vector<EngineGroundSpot> m_groundSpots;
|
std::vector<EngineGroundSpot> m_groundSpots;
|
||||||
//! Ground mark
|
//! Ground mark
|
||||||
EngineGroundMark m_groundMark;
|
EngineGroundMark m_groundMark;
|
||||||
|
//! Team colors
|
||||||
|
std::map<int, Color> m_teamColors;
|
||||||
|
|
||||||
//! Location of camera
|
//! Location of camera
|
||||||
glm::vec3 m_eyePt{ 0, 0, 0 };
|
glm::vec3 m_eyePt{ 0, 0, 0 };
|
||||||
|
|
|
@ -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;
|
CModel model;
|
||||||
try
|
try
|
||||||
|
@ -108,7 +108,7 @@ skip:
|
||||||
if (mirrored)
|
if (mirrored)
|
||||||
Mirror(modelInfo.triangles);
|
Mirror(modelInfo.triangles);
|
||||||
|
|
||||||
FileInfo fileInfo(name, mirrored, variant);
|
FileInfo fileInfo(name, mirrored, team);
|
||||||
m_models[fileInfo] = modelInfo;
|
m_models[fileInfo] = modelInfo;
|
||||||
|
|
||||||
m_engine->AddBaseObjTriangles(modelInfo.baseObjRank, modelInfo.triangles);
|
m_engine->AddBaseObjTriangles(modelInfo.baseObjRank, modelInfo.triangles);
|
||||||
|
@ -116,50 +116,52 @@ skip:
|
||||||
return true;
|
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 (it == m_models.end())
|
||||||
{
|
{
|
||||||
if (!LoadModel(fileName, mirrored, variant))
|
if (!LoadModel(fileName, mirrored, team))
|
||||||
return false;
|
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->SetObjectBaseRank(objRank, (*it).second.baseObjRank);
|
||||||
|
m_engine->SetObjectTeam(objRank, team);
|
||||||
|
|
||||||
return true;
|
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 (it == m_models.end())
|
||||||
{
|
{
|
||||||
if (!LoadModel(fileName, mirrored, variant))
|
if (!LoadModel(fileName, mirrored, team))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
it = m_models.find(FileInfo(fileName, mirrored, variant));
|
it = m_models.find(FileInfo(fileName, mirrored, team));
|
||||||
}
|
}
|
||||||
|
|
||||||
int copyBaseObjRank = m_engine->CreateBaseObject();
|
int copyBaseObjRank = m_engine->CreateBaseObject();
|
||||||
m_engine->CopyBaseObject((*it).second.baseObjRank, copyBaseObjRank);
|
m_engine->CopyBaseObject((*it).second.baseObjRank, copyBaseObjRank);
|
||||||
m_engine->SetObjectBaseRank(objRank, copyBaseObjRank);
|
m_engine->SetObjectBaseRank(objRank, copyBaseObjRank);
|
||||||
|
m_engine->SetObjectTeam(objRank, team);
|
||||||
|
|
||||||
m_copiesBaseRanks.push_back(copyBaseObjRank);
|
m_copiesBaseRanks.push_back(copyBaseObjRank);
|
||||||
|
|
||||||
return true;
|
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())
|
if (it == m_models.end())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -176,9 +178,9 @@ void COldModelManager::DeleteAllModelCopies()
|
||||||
m_copiesBaseRanks.clear();
|
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())
|
if (it == m_models.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -58,19 +58,19 @@ public:
|
||||||
~COldModelManager();
|
~COldModelManager();
|
||||||
|
|
||||||
//! Loads a model from given file
|
//! 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
|
//! 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)
|
//! 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
|
//! 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
|
//! 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
|
//! Deletes all copied objects
|
||||||
void DeleteAllModelCopies();
|
void DeleteAllModelCopies();
|
||||||
|
|
|
@ -237,6 +237,38 @@ void GLTFLoader::ReadMaterials()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (material.contains("emissiveFactor"))
|
||||||
|
{
|
||||||
|
const auto& color = material["emissiveFactor"];
|
||||||
|
|
||||||
|
mat.emissiveColor = {
|
||||||
|
color[0].get<float>(),
|
||||||
|
color[1].get<float>(),
|
||||||
|
color[2].get<float>(),
|
||||||
|
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<int>();
|
||||||
|
|
||||||
|
const auto& texture = m_textures[index];
|
||||||
|
|
||||||
|
const auto& image = m_images[texture.source];
|
||||||
|
|
||||||
|
mat.emissiveTexture = image.uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (material.contains("pbrMetallicRoughness"))
|
if (material.contains("pbrMetallicRoughness"))
|
||||||
{
|
{
|
||||||
const auto& pbr = material["pbrMetallicRoughness"];
|
const auto& pbr = material["pbrMetallicRoughness"];
|
||||||
|
@ -252,6 +284,10 @@ void GLTFLoader::ReadMaterials()
|
||||||
color[3].get<float>()
|
color[3].get<float>()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mat.albedoColor = { 1.0, 1.0, 1.0, 1.0 };
|
||||||
|
}
|
||||||
|
|
||||||
if (pbr.contains("baseColorTexture"))
|
if (pbr.contains("baseColorTexture"))
|
||||||
{
|
{
|
||||||
|
@ -273,27 +309,23 @@ void GLTFLoader::ReadMaterials()
|
||||||
{
|
{
|
||||||
mat.metalness = pbr["metallicFactor"].get<float>();
|
mat.metalness = pbr["metallicFactor"].get<float>();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mat.metalness = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
if (pbr.contains("roughnessFactor"))
|
if (pbr.contains("roughnessFactor"))
|
||||||
{
|
{
|
||||||
mat.roughness = pbr["roughnessFactor"].get<float>();
|
mat.roughness = pbr["roughnessFactor"].get<float>();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (pbr.contains("emissiveFactor"))
|
|
||||||
{
|
{
|
||||||
const auto& color = pbr["emissiveFactor"];
|
mat.roughness = 1.0;
|
||||||
|
|
||||||
mat.emissiveColor = {
|
|
||||||
color[0].get<float>(),
|
|
||||||
color[1].get<float>(),
|
|
||||||
color[2].get<float>(),
|
|
||||||
0.0
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pbr.contains("emissiveTextue"))
|
if (pbr.contains("metallicRoughnessTexture"))
|
||||||
{
|
{
|
||||||
const auto& tex = pbr["emissiveTextue"];
|
const auto& tex = pbr["metallicRoughnessTexture"];
|
||||||
|
|
||||||
if (tex.contains("index"))
|
if (tex.contains("index"))
|
||||||
{
|
{
|
||||||
|
@ -303,9 +335,48 @@ void GLTFLoader::ReadMaterials()
|
||||||
|
|
||||||
const auto& image = m_images[texture.source];
|
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<int>();
|
||||||
|
|
||||||
|
const auto& texture = m_textures[index];
|
||||||
|
|
||||||
|
const auto& image = m_images[texture.source];
|
||||||
|
|
||||||
|
if (tex.contains("strength"))
|
||||||
|
{
|
||||||
|
mat.aoStrength = tex["strength"].get<float>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mat.aoStrength = 1.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (material.contains("normalTexture"))
|
||||||
|
{
|
||||||
|
const auto& tex = material["normalTexture"];
|
||||||
|
|
||||||
|
if (tex.contains("index"))
|
||||||
|
{
|
||||||
|
int index = tex["index"].get<int>();
|
||||||
|
|
||||||
|
const auto& texture = m_textures[index];
|
||||||
|
|
||||||
|
const auto& image = m_images[texture.source];
|
||||||
|
|
||||||
|
mat.normalTexture = image.uri;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (material.contains("alphaMode"))
|
if (material.contains("alphaMode"))
|
||||||
|
|
|
@ -92,6 +92,7 @@ CGL33ObjectRenderer::CGL33ObjectRenderer(CGL33Device* device)
|
||||||
m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor");
|
m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor");
|
||||||
m_roughness = glGetUniformLocation(m_program, "uni_Roughness");
|
m_roughness = glGetUniformLocation(m_program, "uni_Roughness");
|
||||||
m_metalness = glGetUniformLocation(m_program, "uni_Metalness");
|
m_metalness = glGetUniformLocation(m_program, "uni_Metalness");
|
||||||
|
m_aoStrength = glGetUniformLocation(m_program, "uni_AOStrength");
|
||||||
|
|
||||||
m_triplanarMode = glGetUniformLocation(m_program, "uni_TriplanarMode");
|
m_triplanarMode = glGetUniformLocation(m_program, "uni_TriplanarMode");
|
||||||
m_triplanarScale = glGetUniformLocation(m_program, "uni_TriplanarScale");
|
m_triplanarScale = glGetUniformLocation(m_program, "uni_TriplanarScale");
|
||||||
|
@ -207,6 +208,9 @@ void CGL33ObjectRenderer::CGL33ObjectRenderer::Begin()
|
||||||
SetUVTransform({ 0.0f, 0.0f }, { 1.0f, 1.0f });
|
SetUVTransform({ 0.0f, 0.0f }, { 1.0f, 1.0f });
|
||||||
SetAlphaScissor(0.0f);
|
SetAlphaScissor(0.0f);
|
||||||
SetFog(1e+6f, 1e+6, {});
|
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()
|
void CGL33ObjectRenderer::CGL33ObjectRenderer::End()
|
||||||
|
@ -297,10 +301,11 @@ void CGL33ObjectRenderer::SetEmissiveTexture(const Texture& texture)
|
||||||
glBindTexture(GL_TEXTURE_2D, texture.id);
|
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_roughness, roughness);
|
||||||
glUniform1f(m_metalness, metalness);
|
glUniform1f(m_metalness, metalness);
|
||||||
|
glUniform1f(m_aoStrength, aoStrength);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGL33ObjectRenderer::SetMaterialTexture(const Texture& texture)
|
void CGL33ObjectRenderer::SetMaterialTexture(const Texture& texture)
|
||||||
|
|
|
@ -63,7 +63,7 @@ public:
|
||||||
//! Sets emissive texture
|
//! Sets emissive texture
|
||||||
virtual void SetEmissiveTexture(const Texture& texture) override;
|
virtual void SetEmissiveTexture(const Texture& texture) override;
|
||||||
//! Sets material parameters
|
//! Sets material parameters
|
||||||
virtual void SetMaterialParams(float roughness, float metalness) override;
|
virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) override;
|
||||||
//! Sets material texture
|
//! Sets material texture
|
||||||
virtual void SetMaterialTexture(const Texture& texture) override;
|
virtual void SetMaterialTexture(const Texture& texture) override;
|
||||||
|
|
||||||
|
@ -135,6 +135,7 @@ private:
|
||||||
GLint m_emissiveColor = -1;
|
GLint m_emissiveColor = -1;
|
||||||
GLint m_roughness = -1;
|
GLint m_roughness = -1;
|
||||||
GLint m_metalness = -1;
|
GLint m_metalness = -1;
|
||||||
|
GLint m_aoStrength = -1;
|
||||||
|
|
||||||
GLint m_triplanarMode = -1;
|
GLint m_triplanarMode = -1;
|
||||||
GLint m_triplanarScale = -1;
|
GLint m_triplanarScale = -1;
|
||||||
|
|
|
@ -335,6 +335,7 @@ CGL33TerrainRenderer::CGL33TerrainRenderer(CGL33Device* device)
|
||||||
m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor");
|
m_emissiveColor = glGetUniformLocation(m_program, "uni_EmissiveColor");
|
||||||
m_roughness = glGetUniformLocation(m_program, "uni_Roughness");
|
m_roughness = glGetUniformLocation(m_program, "uni_Roughness");
|
||||||
m_metalness = glGetUniformLocation(m_program, "uni_Metalness");
|
m_metalness = glGetUniformLocation(m_program, "uni_Metalness");
|
||||||
|
m_aoStrength = glGetUniformLocation(m_program, "uni_AOStrength");
|
||||||
|
|
||||||
m_shadowRegions = glGetUniformLocation(m_program, "uni_ShadowRegions");
|
m_shadowRegions = glGetUniformLocation(m_program, "uni_ShadowRegions");
|
||||||
|
|
||||||
|
@ -520,10 +521,11 @@ void CGL33TerrainRenderer::SetEmissiveTexture(const Texture& texture)
|
||||||
glBindTexture(GL_TEXTURE_2D, texture.id);
|
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_roughness, roughness);
|
||||||
glUniform1f(m_metalness, metalness);
|
glUniform1f(m_metalness, metalness);
|
||||||
|
glUniform1f(m_aoStrength, aoStrength);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGL33TerrainRenderer::SetMaterialTexture(const Texture& texture)
|
void CGL33TerrainRenderer::SetMaterialTexture(const Texture& texture)
|
||||||
|
|
|
@ -135,7 +135,7 @@ public:
|
||||||
//! Sets emissive texture
|
//! Sets emissive texture
|
||||||
virtual void SetEmissiveTexture(const Texture& texture) override;
|
virtual void SetEmissiveTexture(const Texture& texture) override;
|
||||||
//! Sets material parameters
|
//! Sets material parameters
|
||||||
virtual void SetMaterialParams(float roughness, float metalness) override;
|
virtual void SetMaterialParams(float roughness, float metalness, float aoStrength) override;
|
||||||
//! Sets material texture
|
//! Sets material texture
|
||||||
virtual void SetMaterialTexture(const Texture& texture) override;
|
virtual void SetMaterialTexture(const Texture& texture) override;
|
||||||
|
|
||||||
|
@ -182,6 +182,7 @@ private:
|
||||||
GLint m_emissiveColor = -1;
|
GLint m_emissiveColor = -1;
|
||||||
GLint m_roughness = -1;
|
GLint m_roughness = -1;
|
||||||
GLint m_metalness = -1;
|
GLint m_metalness = -1;
|
||||||
|
GLint m_aoStrength = -1;
|
||||||
|
|
||||||
struct ShadowUniforms
|
struct ShadowUniforms
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@ uniform sampler2D uni_DetailTexture;
|
||||||
|
|
||||||
uniform float uni_Roughness;
|
uniform float uni_Roughness;
|
||||||
uniform float uni_Metalness;
|
uniform float uni_Metalness;
|
||||||
|
uniform float uni_AOStrength;
|
||||||
uniform sampler2D uni_MaterialTexture;
|
uniform sampler2D uni_MaterialTexture;
|
||||||
|
|
||||||
uniform vec3 uni_EmissiveColor;
|
uniform vec3 uni_EmissiveColor;
|
||||||
|
@ -97,7 +98,7 @@ void main()
|
||||||
|
|
||||||
vec3 params = texture(uni_MaterialTexture, data.TexCoord0).xyz;
|
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 roughness = uni_Roughness * params.g;
|
||||||
float metalness = uni_Metalness * params.b;
|
float metalness = uni_Metalness * params.b;
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ void main()
|
||||||
data.Color = in_Color;
|
data.Color = in_Color;
|
||||||
data.TexCoord0 = in_TexCoord0 * uni_UVScale + uni_UVOffset;
|
data.TexCoord0 = in_TexCoord0 * uni_UVScale + uni_UVOffset;
|
||||||
data.TexCoord1 = in_TexCoord1;
|
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.VertexCoord = in_VertexCoord.xyz;
|
||||||
data.VertexNormal = in_Normal;
|
data.VertexNormal = in_Normal;
|
||||||
data.Position = position.xyz;
|
data.Position = position.xyz;
|
||||||
|
|
|
@ -28,6 +28,7 @@ uniform sampler2D uni_DetailTexture;
|
||||||
|
|
||||||
uniform float uni_Roughness;
|
uniform float uni_Roughness;
|
||||||
uniform float uni_Metalness;
|
uniform float uni_Metalness;
|
||||||
|
uniform float uni_AOStrength;
|
||||||
uniform sampler2D uni_MaterialTexture;
|
uniform sampler2D uni_MaterialTexture;
|
||||||
|
|
||||||
uniform vec3 uni_EmissiveColor;
|
uniform vec3 uni_EmissiveColor;
|
||||||
|
@ -65,7 +66,7 @@ void main()
|
||||||
|
|
||||||
vec3 params = texture(uni_MaterialTexture, data.TexCoord0).xyz;
|
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 roughness = uni_Roughness * params.g;
|
||||||
float metalness = uni_Metalness * params.b;
|
float metalness = uni_Metalness * params.b;
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ void main()
|
||||||
data.Color = in_Color;
|
data.Color = in_Color;
|
||||||
data.TexCoord0 = in_TexCoord0;
|
data.TexCoord0 = in_TexCoord0;
|
||||||
data.TexCoord1 = in_TexCoord1;
|
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.Distance = abs(eyeSpace.z);
|
||||||
data.Position = position.xyz;
|
data.Position = position.xyz;
|
||||||
data.ShadowCoords = ProjectShadows(position.xyz);
|
data.ShadowCoords = ProjectShadows(position.xyz);
|
||||||
|
|
|
@ -4039,6 +4039,8 @@ void CRobotMain::ChangeColor()
|
||||||
std::string teamStr = StrUtils::ToString<int>(team);
|
std::string teamStr = StrUtils::ToString<int>(team);
|
||||||
if(team == 0) teamStr = "";
|
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/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/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);
|
//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);
|
||||||
|
|
Loading…
Reference in New Issue