diff --git a/binaries/data/mods/public/art/materials/alphatest.xml b/binaries/data/mods/public/art/materials/alphatest.xml
index 7af040a652..29f32cfb68 100644
--- a/binaries/data/mods/public/art/materials/alphatest.xml
+++ b/binaries/data/mods/public/art/materials/alphatest.xml
@@ -3,4 +3,6 @@
+
+
diff --git a/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml b/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml
index 6f25c12054..f92fa56585 100644
--- a/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/alphatest_ao_parallax_spec.xml
@@ -1,9 +1,12 @@
+
+
+
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans.xml b/binaries/data/mods/public/art/materials/basic_trans.xml
index a0dab6d40d..2152f9bd27 100644
--- a/binaries/data/mods/public/art/materials/basic_trans.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans.xml
@@ -4,4 +4,6 @@
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_ao.xml b/binaries/data/mods/public/art/materials/basic_trans_ao.xml
index 1a55920711..c0b6afe074 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_ao.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_ao.xml
@@ -14,7 +14,6 @@
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
index 362745d45a..ee4e6a2f24 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_ao_parallax_spec.xml
@@ -9,12 +9,9 @@
-
-
-
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_ao_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_ao_spec.xml
index 7a39990f78..09291b3f39 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_ao_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_ao_spec.xml
@@ -11,10 +11,8 @@
-->
-
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
index e9aa8b2085..7c7e6603b8 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_parallax_spec.xml
@@ -9,9 +9,7 @@
-
-
@@ -22,4 +20,7 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_spec.xml b/binaries/data/mods/public/art/materials/basic_trans_spec.xml
index 6bee2513a5..4afcbef6b9 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_spec.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_spec.xml
@@ -11,7 +11,6 @@
-->
-
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/basic_trans_wind.xml b/binaries/data/mods/public/art/materials/basic_trans_wind.xml
index e8759a5f1d..4facb601e9 100644
--- a/binaries/data/mods/public/art/materials/basic_trans_wind.xml
+++ b/binaries/data/mods/public/art/materials/basic_trans_wind.xml
@@ -6,4 +6,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/blend_spec.xml b/binaries/data/mods/public/art/materials/blend_spec.xml
index 891499445d..b59afca7da 100644
--- a/binaries/data/mods/public/art/materials/blend_spec.xml
+++ b/binaries/data/mods/public/art/materials/blend_spec.xml
@@ -9,4 +9,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/default.xml b/binaries/data/mods/public/art/materials/default.xml
index 2337fa18e9..96390ae005 100644
--- a/binaries/data/mods/public/art/materials/default.xml
+++ b/binaries/data/mods/public/art/materials/default.xml
@@ -1,4 +1,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/material.rnc b/binaries/data/mods/public/art/materials/material.rnc
index 280f71bb2c..5bc46eb04f 100644
--- a/binaries/data/mods/public/art/materials/material.rnc
+++ b/binaries/data/mods/public/art/materials/material.rnc
@@ -39,4 +39,7 @@ element material {
element renderquery {
attribute name { text }
}*
+ element required_texture {
+ attribute name { text }
+ }*
}
diff --git a/binaries/data/mods/public/art/materials/material.rng b/binaries/data/mods/public/art/materials/material.rng
index 2cb5b07681..6a2a92b206 100644
--- a/binaries/data/mods/public/art/materials/material.rng
+++ b/binaries/data/mods/public/art/materials/material.rng
@@ -86,5 +86,10 @@
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/no_trans_ao.xml b/binaries/data/mods/public/art/materials/no_trans_ao.xml
index 71430cf7de..714f287b3b 100644
--- a/binaries/data/mods/public/art/materials/no_trans_ao.xml
+++ b/binaries/data/mods/public/art/materials/no_trans_ao.xml
@@ -11,7 +11,6 @@
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/no_trans_parallax_ao.xml b/binaries/data/mods/public/art/materials/no_trans_parallax_ao.xml
index 26f9a3aec1..0d3ce89a92 100644
--- a/binaries/data/mods/public/art/materials/no_trans_parallax_ao.xml
+++ b/binaries/data/mods/public/art/materials/no_trans_parallax_ao.xml
@@ -6,11 +6,9 @@
-
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/objectcolor.xml b/binaries/data/mods/public/art/materials/objectcolor.xml
index 92ebf138c0..33609c2e31 100644
--- a/binaries/data/mods/public/art/materials/objectcolor.xml
+++ b/binaries/data/mods/public/art/materials/objectcolor.xml
@@ -2,4 +2,6 @@
+
+
diff --git a/binaries/data/mods/public/art/materials/objectcolor_spec.xml b/binaries/data/mods/public/art/materials/objectcolor_spec.xml
index 9e4f90ab37..824ea2b807 100644
--- a/binaries/data/mods/public/art/materials/objectcolor_spec.xml
+++ b/binaries/data/mods/public/art/materials/objectcolor_spec.xml
@@ -7,4 +7,6 @@
+
+
diff --git a/binaries/data/mods/public/art/materials/objectcolor_specmap.xml b/binaries/data/mods/public/art/materials/objectcolor_specmap.xml
index 4dee4f9bce..47d7c892fa 100644
--- a/binaries/data/mods/public/art/materials/objectcolor_specmap.xml
+++ b/binaries/data/mods/public/art/materials/objectcolor_specmap.xml
@@ -4,6 +4,8 @@
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans.xml b/binaries/data/mods/public/art/materials/player_trans.xml
index ca076afbd7..8f80e0c73f 100644
--- a/binaries/data/mods/public/art/materials/player_trans.xml
+++ b/binaries/data/mods/public/art/materials/player_trans.xml
@@ -2,4 +2,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_ao.xml b/binaries/data/mods/public/art/materials/player_trans_ao.xml
index 877696322b..1bba20ac2a 100644
--- a/binaries/data/mods/public/art/materials/player_trans_ao.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_ao.xml
@@ -12,7 +12,6 @@
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_ao_parallax_spec.xml b/binaries/data/mods/public/art/materials/player_trans_ao_parallax_spec.xml
index 211f680116..004e1da292 100644
--- a/binaries/data/mods/public/art/materials/player_trans_ao_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_ao_parallax_spec.xml
@@ -7,12 +7,9 @@
-
-
-
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_ao_spec.xml b/binaries/data/mods/public/art/materials/player_trans_ao_spec.xml
index 677039d4e2..27acc37695 100644
--- a/binaries/data/mods/public/art/materials/player_trans_ao_spec.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_ao_spec.xml
@@ -7,12 +7,9 @@
-
-
-
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_parallax.xml b/binaries/data/mods/public/art/materials/player_trans_parallax.xml
index 7eb621d461..cb08468b46 100644
--- a/binaries/data/mods/public/art/materials/player_trans_parallax.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_parallax.xml
@@ -7,7 +7,6 @@
-
@@ -20,4 +19,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_parallax_spec.xml b/binaries/data/mods/public/art/materials/player_trans_parallax_spec.xml
index 0300f30f2a..cc3f14808d 100644
--- a/binaries/data/mods/public/art/materials/player_trans_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_parallax_spec.xml
@@ -7,9 +7,7 @@
-
-
@@ -20,4 +18,9 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_spec.xml b/binaries/data/mods/public/art/materials/player_trans_spec.xml
index e43cafb4d2..191aebbd7f 100644
--- a/binaries/data/mods/public/art/materials/player_trans_spec.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_spec.xml
@@ -3,7 +3,6 @@
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_trans_spec_helmet.xml b/binaries/data/mods/public/art/materials/player_trans_spec_helmet.xml
index 0c95cdb1dd..017999b2a3 100644
--- a/binaries/data/mods/public/art/materials/player_trans_spec_helmet.xml
+++ b/binaries/data/mods/public/art/materials/player_trans_spec_helmet.xml
@@ -3,7 +3,6 @@
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/player_water.xml b/binaries/data/mods/public/art/materials/player_water.xml
index 15007bec4d..768c94c0dc 100644
--- a/binaries/data/mods/public/art/materials/player_water.xml
+++ b/binaries/data/mods/public/art/materials/player_water.xml
@@ -13,4 +13,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/playercolor_spec.xml b/binaries/data/mods/public/art/materials/playercolor_spec.xml
index 2cb7f77736..9db6d2765a 100644
--- a/binaries/data/mods/public/art/materials/playercolor_spec.xml
+++ b/binaries/data/mods/public/art/materials/playercolor_spec.xml
@@ -7,4 +7,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/rock_bump_spec_ao_test.xml b/binaries/data/mods/public/art/materials/rock_bump_spec_ao_test.xml
index 99a91301b7..728af660d5 100644
--- a/binaries/data/mods/public/art/materials/rock_bump_spec_ao_test.xml
+++ b/binaries/data/mods/public/art/materials/rock_bump_spec_ao_test.xml
@@ -17,7 +17,6 @@
-
-
-
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/rock_bump_spec_test.xml b/binaries/data/mods/public/art/materials/rock_bump_spec_test.xml
index 1984562974..a1922c21d0 100644
--- a/binaries/data/mods/public/art/materials/rock_bump_spec_test.xml
+++ b/binaries/data/mods/public/art/materials/rock_bump_spec_test.xml
@@ -16,7 +16,6 @@
-
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/terrain_base.xml b/binaries/data/mods/public/art/materials/terrain_base.xml
index 56401e161a..707b822a64 100644
--- a/binaries/data/mods/public/art/materials/terrain_base.xml
+++ b/binaries/data/mods/public/art/materials/terrain_base.xml
@@ -1,4 +1,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/terrain_grass.xml b/binaries/data/mods/public/art/materials/terrain_grass.xml
index 4026caa2ba..2ca8c94be3 100644
--- a/binaries/data/mods/public/art/materials/terrain_grass.xml
+++ b/binaries/data/mods/public/art/materials/terrain_grass.xml
@@ -5,4 +5,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/terrain_norm.xml b/binaries/data/mods/public/art/materials/terrain_norm.xml
index 1b56be661a..24010a9739 100644
--- a/binaries/data/mods/public/art/materials/terrain_norm.xml
+++ b/binaries/data/mods/public/art/materials/terrain_norm.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/binaries/data/mods/public/art/materials/terrain_norm_spec.xml b/binaries/data/mods/public/art/materials/terrain_norm_spec.xml
index e06d2abc49..9f650723de 100644
--- a/binaries/data/mods/public/art/materials/terrain_norm_spec.xml
+++ b/binaries/data/mods/public/art/materials/terrain_norm_spec.xml
@@ -1,8 +1,9 @@
-
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/terrain_triplanar.xml b/binaries/data/mods/public/art/materials/terrain_triplanar.xml
index 2be2679a17..88b5b77c33 100644
--- a/binaries/data/mods/public/art/materials/terrain_triplanar.xml
+++ b/binaries/data/mods/public/art/materials/terrain_triplanar.xml
@@ -4,4 +4,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/terrain_triplanar_norm_spec.xml b/binaries/data/mods/public/art/materials/terrain_triplanar_norm_spec.xml
index 5b78843e6a..f10d7ff1ed 100644
--- a/binaries/data/mods/public/art/materials/terrain_triplanar_norm_spec.xml
+++ b/binaries/data/mods/public/art/materials/terrain_triplanar_norm_spec.xml
@@ -1,9 +1,10 @@
-
-
+
+
+
diff --git a/binaries/data/mods/public/art/materials/trans_wind.xml b/binaries/data/mods/public/art/materials/trans_wind.xml
index 115f281375..bcadbf4e51 100644
--- a/binaries/data/mods/public/art/materials/trans_wind.xml
+++ b/binaries/data/mods/public/art/materials/trans_wind.xml
@@ -4,4 +4,5 @@
+
diff --git a/binaries/data/mods/public/art/materials/trans_wind_parallax_spec.xml b/binaries/data/mods/public/art/materials/trans_wind_parallax_spec.xml
index 96d9deeadc..9193a823b9 100644
--- a/binaries/data/mods/public/art/materials/trans_wind_parallax_spec.xml
+++ b/binaries/data/mods/public/art/materials/trans_wind_parallax_spec.xml
@@ -6,11 +6,13 @@
-
-
+
+
+
+
diff --git a/binaries/data/mods/public/art/materials/waterfall.xml b/binaries/data/mods/public/art/materials/waterfall.xml
index 2dfba0d6b8..112f61e300 100644
--- a/binaries/data/mods/public/art/materials/waterfall.xml
+++ b/binaries/data/mods/public/art/materials/waterfall.xml
@@ -7,4 +7,6 @@
+
+
diff --git a/source/graphics/Material.cpp b/source/graphics/Material.cpp
index f9730be71d..7fb0346d7a 100644
--- a/source/graphics/Material.cpp
+++ b/source/graphics/Material.cpp
@@ -60,6 +60,13 @@ void CMaterial::AddRenderQuery(const char* key)
m_RenderQueries.Add(key);
}
+void CMaterial::AddRequiredSampler(const CStr& samplerName)
+{
+ CStrIntern string(samplerName);
+ m_RequiredSamplers.push_back(string);
+}
+
+
// Set up m_CombinedShaderDefines so that index i contains m_ShaderDefines, plus
// the extra defines from m_ConditionalDefines[j] for all j where bit j is set in i.
// This lets GetShaderDefines() cheaply return the defines for any combination of conditions.
diff --git a/source/graphics/Material.h b/source/graphics/Material.h
index 139754c0ab..756d9a2091 100644
--- a/source/graphics/Material.h
+++ b/source/graphics/Material.h
@@ -31,7 +31,8 @@ public:
struct TextureSampler
{
- TextureSampler(CStr &n, CTexturePtr t) : Name(n), Sampler(t) {}
+ TextureSampler(const CStr &n, CTexturePtr t) : Name(n), Sampler(t) {}
+ TextureSampler(const CStrIntern &n, CTexturePtr t) : Name(n), Sampler(t) {}
CStrIntern Name;
CTexturePtr Sampler;
@@ -74,6 +75,9 @@ public:
void AddRenderQuery(const char* key);
const CShaderRenderQueries& GetRenderQueries() const { return m_RenderQueries; }
+ void AddRequiredSampler(const CStr& samplerName);
+ const std::vector& GetRequiredSampler() const { return m_RequiredSamplers; }
+
// Must be called after all AddShaderDefine and AddConditionalDefine
void RecomputeCombinedShaderDefines();
@@ -84,6 +88,7 @@ private:
CTexturePtr m_DiffuseTexture;
SamplersVector m_Samplers;
+ std::vector m_RequiredSamplers;
CStrIntern m_ShaderEffect;
CShaderDefines m_ShaderDefines;
diff --git a/source/graphics/MaterialManager.cpp b/source/graphics/MaterialManager.cpp
index 9e228811f0..341fb3ba8c 100644
--- a/source/graphics/MaterialManager.cpp
+++ b/source/graphics/MaterialManager.cpp
@@ -58,9 +58,11 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname)
EL(shader);
EL(uniform);
EL(renderquery);
+ EL(required_texture);
EL(conditional_define);
AT(effect);
AT(if);
+ AT(define);
AT(quality);
AT(material);
AT(name);
@@ -180,6 +182,12 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname)
{
material.AddRenderQuery(attrs.GetNamedItem(at_name).c_str());
}
+ else if (token == el_required_texture)
+ {
+ material.AddRequiredSampler(attrs.GetNamedItem(at_name));
+ if (!attrs.GetNamedItem(at_define).empty())
+ material.AddShaderDefine(CStrIntern(attrs.GetNamedItem(at_define)), str_1);
+ }
}
material.RecomputeCombinedShaderDefines();
diff --git a/source/graphics/ObjectBase.cpp b/source/graphics/ObjectBase.cpp
index c32e285d1c..b77fcf371a 100644
--- a/source/graphics/ObjectBase.cpp
+++ b/source/graphics/ObjectBase.cpp
@@ -164,7 +164,7 @@ bool CObjectBase::Load(const VfsPath& pathname)
if (se.Name == at_file)
samp.m_SamplerFile = VfsPath("art/textures/skins") / se.Value.FromUTF8();
else if (se.Name == at_name)
- samp.m_SamplerName = se.Value;
+ samp.m_SamplerName = CStrIntern(se.Value);
}
currentVariant->m_Samplers.push_back(samp);
}
@@ -459,9 +459,9 @@ const CObjectBase::Variation CObjectBase::BuildVariation(const std::vector&
// Same for samplers, though perhaps not strictly necessary:
for (std::vector::iterator it = var.m_Samplers.begin(); it != var.m_Samplers.end(); ++it)
- variation.samplers.erase(it->m_SamplerName);
+ variation.samplers.erase(it->m_SamplerName.string());
for (std::vector::iterator it = var.m_Samplers.begin(); it != var.m_Samplers.end(); ++it)
- variation.samplers.insert(make_pair(it->m_SamplerName, *it));
+ variation.samplers.insert(make_pair(it->m_SamplerName.string(), *it));
}
return variation;
diff --git a/source/graphics/ObjectBase.h b/source/graphics/ObjectBase.h
index 9c020ab830..123a6ecd59 100644
--- a/source/graphics/ObjectBase.h
+++ b/source/graphics/ObjectBase.h
@@ -28,6 +28,7 @@ class CObjectManager;
#include
#include "lib/file/vfs/vfs_path.h"
#include "ps/CStr.h"
+#include "ps/CStrIntern.h"
#include
@@ -70,7 +71,7 @@ public:
struct Samp
{
// identifier name of sampler in GLSL shaders
- CStr m_SamplerName;
+ CStrIntern m_SamplerName;
// path to load from
VfsPath m_SamplerFile;
};
diff --git a/source/graphics/ObjectEntry.cpp b/source/graphics/ObjectEntry.cpp
index fcd511308b..e892b3f320 100644
--- a/source/graphics/ObjectEntry.cpp
+++ b/source/graphics/ObjectEntry.cpp
@@ -136,19 +136,26 @@ bool CObjectEntry::BuildVariation(const std::vector >& selections
LOGERROR("Actor '%s' has no textures.", utf8_from_wstring(m_Base->m_ShortName));
}
- std::vector::iterator samp;
- for (samp = m_Samplers.begin(); samp != m_Samplers.end(); ++samp)
+ for (const auto& samp : m_Samplers)
{
- CTextureProperties textureProps(samp->m_SamplerFile);
+ CTextureProperties textureProps(samp.m_SamplerFile);
textureProps.SetWrap(GL_CLAMP_TO_EDGE);
CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
// if we've loaded this model we're probably going to render it soon, so prefetch its texture.
// All textures are prefetched even in the fixed pipeline, including the normal maps etc.
// TODO: Should check which renderpath is selected and only preload the necessary textures.
texture->Prefetch();
- model->GetMaterial().AddSampler(CMaterial::TextureSampler(samp->m_SamplerName, texture));
+ model->GetMaterial().AddSampler(CMaterial::TextureSampler(samp.m_SamplerName, texture));
}
+ const std::vector& requiredSamplers = model->GetMaterial().GetRequiredSampler();
+ for (const auto& requSampName : requiredSamplers)
+ {
+ if (std::find_if(m_Samplers.begin(), m_Samplers.end(),
+ [&](CObjectBase::Samp sampler) { return sampler.m_SamplerName == requSampName; }) == m_Samplers.end())
+ LOGERROR("Actor %s: required texture sampler %s not found (material %s)", utf8_from_wstring(m_Base->m_ShortName), requSampName.string().c_str(), m_Base->m_Material.string8().c_str());
+ }
+
// calculate initial object space bounds, based on vertex positions
model->CalcStaticObjectBounds();