1616
1717#include < gltfio/MaterialProvider.h>
1818
19+ #include < filament/MaterialEnums.h>
1920#include < filamat/MaterialBuilder.h>
2021
2122#include < utils/Hash.h>
2223
2324#include < tsl/robin_map.h>
2425
2526#include < string>
27+ #include < unordered_map>
2628
2729using namespace filamat ;
2830using namespace filament ;
@@ -33,7 +35,8 @@ namespace {
3335
3436class JitShaderProvider : public MaterialProvider {
3537public:
36- explicit JitShaderProvider (Engine* engine, bool optimizeShaders);
38+ explicit JitShaderProvider (Engine* engine, bool optimizeShaders,
39+ utils::FixedCapacityVector<char const *> const & variantFilters);
3740 ~JitShaderProvider () override ;
3841
3942 MaterialInstance* createMaterialInstance (MaterialKey* config, UvMap* uvmap,
@@ -49,15 +52,37 @@ class JitShaderProvider : public MaterialProvider {
4952 return false ;
5053 }
5154
55+ private:
5256 using HashFn = hash::MurmurHashFn<MaterialKey>;
5357 tsl::robin_map<MaterialKey, Material*, HashFn> mCache ;
5458 std::vector<Material*> mMaterials ;
5559 Engine* const mEngine ;
5660 const bool mOptimizeShaders ;
61+ filament::UserVariantFilterMask mVariantFilter ;
5762};
5863
59- JitShaderProvider::JitShaderProvider (Engine* engine, bool optimizeShaders) : mEngine (engine),
60- mOptimizeShaders (optimizeShaders) {
64+ JitShaderProvider::JitShaderProvider (Engine* engine, bool optimizeShaders,
65+ utils::FixedCapacityVector<char const *> const & variantFilters)
66+ : mEngine (engine),
67+ mOptimizeShaders (optimizeShaders) {
68+
69+ // Note that this is the same as the list in tools/matc/src/ParametersProcessor.cpp
70+ static const std::unordered_map<std::string, filament::UserVariantFilterBit> strToEnum = [] {
71+ std::unordered_map<std::string, filament::UserVariantFilterBit> strToEnum;
72+ strToEnum[" directionalLighting" ] = filament::UserVariantFilterBit::DIRECTIONAL_LIGHTING;
73+ strToEnum[" dynamicLighting" ] = filament::UserVariantFilterBit::DYNAMIC_LIGHTING;
74+ strToEnum[" shadowReceiver" ] = filament::UserVariantFilterBit::SHADOW_RECEIVER;
75+ strToEnum[" skinning" ] = filament::UserVariantFilterBit::SKINNING;
76+ strToEnum[" vsm" ] = filament::UserVariantFilterBit::VSM;
77+ strToEnum[" fog" ] = filament::UserVariantFilterBit::FOG;
78+ strToEnum[" ssr" ] = filament::UserVariantFilterBit::SSR;
79+ strToEnum[" stereo" ] = filament::UserVariantFilterBit::STE;
80+ return strToEnum;
81+ }();
82+
83+ for (auto & filterStr : variantFilters) {
84+ mVariantFilter |= (uint32_t )strToEnum.at (filterStr);
85+ }
6186 MaterialBuilder::init ();
6287}
6388
@@ -344,24 +369,25 @@ std::string shaderFromKey(const MaterialKey& config) {
344369}
345370
346371Material* createMaterial (Engine* engine, const MaterialKey& config, const UvMap& uvmap,
347- const char * name, bool optimizeShaders) {
372+ const char * name, bool optimizeShaders, filament::UserVariantFilterMask variantFilter ) {
348373 std::string shader = shaderFromKey (config);
349374 processShaderString (&shader, uvmap, config);
350375 MaterialBuilder builder;
351376 builder.name (name)
352- .flipUV (false )
353- .specularAmbientOcclusion (MaterialBuilder::SpecularAmbientOcclusion::SIMPLE)
354- .specularAntiAliasing (true )
355- .clearCoatIorChange (false )
356- .material (shader.c_str ())
357- .doubleSided (config.doubleSided )
358- .transparencyMode (config.doubleSided ?
359- MaterialBuilder::TransparencyMode::TWO_PASSES_TWO_SIDES :
360- MaterialBuilder::TransparencyMode::DEFAULT)
361- .reflectionMode (MaterialBuilder::ReflectionMode::SCREEN_SPACE)
362- .targetApi (filamat::targetApiFromBackend (engine->getBackend ()))
363- .stereoscopicType (engine->getConfig ().stereoscopicType )
364- .stereoscopicEyeCount (engine->getConfig ().stereoscopicEyeCount );
377+ .flipUV (false )
378+ .specularAmbientOcclusion (MaterialBuilder::SpecularAmbientOcclusion::SIMPLE)
379+ .specularAntiAliasing (true )
380+ .clearCoatIorChange (false )
381+ .material (shader.c_str ())
382+ .doubleSided (config.doubleSided )
383+ .transparencyMode (config.doubleSided
384+ ? MaterialBuilder::TransparencyMode::TWO_PASSES_TWO_SIDES
385+ : MaterialBuilder::TransparencyMode::DEFAULT)
386+ .reflectionMode (MaterialBuilder::ReflectionMode::SCREEN_SPACE)
387+ .targetApi (filamat::targetApiFromBackend (engine->getBackend ()))
388+ .stereoscopicType (engine->getConfig ().stereoscopicType )
389+ .stereoscopicEyeCount (engine->getConfig ().stereoscopicEyeCount )
390+ .variantFilter (variantFilter);
365391
366392 if (!optimizeShaders) {
367393 builder.optimization (MaterialBuilder::Optimization::NONE);
@@ -589,13 +615,13 @@ Material* JitShaderProvider::getMaterial(MaterialKey* config, UvMap* uvmap, cons
589615 constrainMaterial (config, uvmap);
590616 auto iter = mCache .find (*config);
591617 if (iter == mCache .end ()) {
592-
593618 bool optimizeShaders = mOptimizeShaders ;
594619#ifndef NDEBUG
595620 optimizeShaders = false ;
596621#endif
597622
598- Material* mat = createMaterial (mEngine , *config, *uvmap, label, optimizeShaders);
623+ Material* mat =
624+ createMaterial (mEngine , *config, *uvmap, label, optimizeShaders, mVariantFilter );
599625 mCache .emplace (std::make_pair (*config, mat));
600626 mMaterials .push_back (mat);
601627 return mat;
@@ -612,8 +638,9 @@ MaterialInstance* JitShaderProvider::createMaterialInstance(MaterialKey* config,
612638
613639namespace filament ::gltfio {
614640
615- MaterialProvider* createJitShaderProvider (filament::Engine* engine, bool optimizeShaders) {
616- return new JitShaderProvider (engine, optimizeShaders);
641+ MaterialProvider* createJitShaderProvider (Engine* engine, bool optimizeShaders,
642+ utils::FixedCapacityVector<char const *> const & variantFilters) {
643+ return new JitShaderProvider (engine, optimizeShaders, variantFilters);
617644}
618645
619646} // namespace filament::gltfio
0 commit comments