From 618fe818148cd8b2b55e8028caae33df131d5369 Mon Sep 17 00:00:00 2001 From: wraitii Date: Sun, 15 Mar 2015 11:37:26 +0000 Subject: [PATCH] Check when loading an actor that it defines all the texture samplers required by its material. Print out a readable error otherwise. Fixes #1613 (note that this does not check for unnecessary samplers as that is non-trivial and does not lead to graphical glitches). Also add a shortcut for some defines to clean-up material files slightly and make the link between sampler and shader more explicit. This was SVN commit r16427. --- .../data/mods/public/art/materials/alphatest.xml | 2 ++ .../art/materials/alphatest_ao_parallax_spec.xml | 3 +++ .../mods/public/art/materials/alphatest_spec.xml | 1 + binaries/data/mods/public/art/materials/aura.xml | 3 ++- .../data/mods/public/art/materials/basic_glow.xml | 14 +++++++------- .../data/mods/public/art/materials/basic_spec.xml | 2 ++ .../mods/public/art/materials/basic_specmap.xml | 4 +++- .../mods/public/art/materials/basic_trans.xml | 2 ++ .../mods/public/art/materials/basic_trans_ao.xml | 4 +++- .../materials/basic_trans_ao_parallax_spec.xml | 8 +++++--- .../public/art/materials/basic_trans_ao_spec.xml | 6 ++++-- .../art/materials/basic_trans_parallax_spec.xml | 5 +++-- .../public/art/materials/basic_trans_spec.xml | 6 +++++- .../public/art/materials/basic_trans_wind.xml | 1 + .../data/mods/public/art/materials/blend_spec.xml | 1 + .../data/mods/public/art/materials/default.xml | 1 + .../data/mods/public/art/materials/material.rnc | 3 +++ .../data/mods/public/art/materials/material.rng | 5 +++++ .../mods/public/art/materials/no_trans_ao.xml | 4 +++- .../public/art/materials/no_trans_parallax_ao.xml | 6 ++++-- .../mods/public/art/materials/objectcolor.xml | 2 ++ .../public/art/materials/objectcolor_spec.xml | 2 ++ .../public/art/materials/objectcolor_specmap.xml | 4 +++- .../mods/public/art/materials/player_trans.xml | 1 + .../mods/public/art/materials/player_trans_ao.xml | 5 ++++- .../materials/player_trans_ao_parallax_spec.xml | 8 +++++--- .../public/art/materials/player_trans_ao_spec.xml | 9 ++++++--- .../art/materials/player_trans_parallax.xml | 5 ++++- .../art/materials/player_trans_parallax_spec.xml | 7 +++++-- .../public/art/materials/player_trans_spec.xml | 5 ++++- .../art/materials/player_trans_spec_helmet.xml | 5 ++++- .../mods/public/art/materials/player_water.xml | 1 + .../public/art/materials/playercolor_spec.xml | 1 + .../art/materials/rock_bump_spec_ao_test.xml | 9 ++++++--- .../public/art/materials/rock_bump_spec_test.xml | 6 ++++-- .../mods/public/art/materials/terrain_base.xml | 1 + .../mods/public/art/materials/terrain_grass.xml | 1 + .../mods/public/art/materials/terrain_norm.xml | 2 +- .../public/art/materials/terrain_norm_spec.xml | 5 +++-- .../public/art/materials/terrain_triplanar.xml | 1 + .../art/materials/terrain_triplanar_norm_spec.xml | 5 +++-- .../data/mods/public/art/materials/trans_wind.xml | 1 + .../art/materials/trans_wind_parallax_spec.xml | 6 ++++-- .../data/mods/public/art/materials/waterfall.xml | 2 ++ source/graphics/Material.cpp | 7 +++++++ source/graphics/Material.h | 7 ++++++- source/graphics/MaterialManager.cpp | 8 ++++++++ source/graphics/ObjectBase.cpp | 6 +++--- source/graphics/ObjectBase.h | 3 ++- source/graphics/ObjectEntry.cpp | 15 +++++++++++---- 50 files changed, 166 insertions(+), 55 deletions(-) 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();