diff --git a/filament/src/Engine.cpp b/filament/src/Engine.cpp index 1a8762f26d..30c5119068 100644 --- a/filament/src/Engine.cpp +++ b/filament/src/Engine.cpp @@ -717,7 +717,7 @@ void FEngine::destroy(const FStream* p) { } -inline void FEngine::destroy(const FMaterial* ptr) { +void FEngine::destroy(const FMaterial* ptr) { if (ptr != nullptr) { auto pos = mMaterialInstances.find(ptr); if (pos != mMaterialInstances.cend()) { @@ -732,7 +732,7 @@ inline void FEngine::destroy(const FMaterial* ptr) { } } -inline void FEngine::destroy(const FMaterialInstance* ptr) { +void FEngine::destroy(const FMaterialInstance* ptr) { if (ptr != nullptr) { auto pos = mMaterialInstances.find(ptr->getMaterial()); assert(pos != mMaterialInstances.cend()); diff --git a/filament/src/MaterialInstance.cpp b/filament/src/MaterialInstance.cpp index eb2e33c0f7..902e3b9c62 100644 --- a/filament/src/MaterialInstance.cpp +++ b/filament/src/MaterialInstance.cpp @@ -117,8 +117,7 @@ void FMaterialInstance::commitSlow(FEngine& engine) const { template inline void FMaterialInstance::setParameter(const char* name, T value) noexcept { - auto const& uib = mMaterial->getUniformInterfaceBlock(); - ssize_t offset = uib.getUniformOffset(name, 0); + ssize_t offset = mMaterial->getUniformInterfaceBlock().getUniformOffset(name, 0); if (offset >= 0) { mUniforms.setUniform(size_t(offset), value); // handles specialization for mat3f } @@ -146,6 +145,44 @@ void FMaterialInstance::setDoubleSided(bool doubleSided) noexcept { setParameter("_doubleSided", doubleSided); } +// explicit template instantiation of our supported types +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, bool v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, float v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, int32_t v); +template UTILS_NOINLINE void FMaterialInstance::setParameter(const char* name, uint32_t v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, bool2 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, bool3 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, bool4 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, int2 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, int3 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, int4 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, uint2 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, uint3 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, uint4 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, float2 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, float3 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, float4 v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, mat3f v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, mat4f v); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const bool *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const float *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const int32_t *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter(const char* name, const uint32_t *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const bool2 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const bool3 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const bool4 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const int2 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const int3 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const int4 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const uint2 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const uint3 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const uint4 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const float2 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const float3 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const float4 *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const mat3f *v, size_t c); +template UTILS_NOINLINE void FMaterialInstance::setParameter (const char* name, const mat4f *v, size_t c); + } // namespace details using namespace details; @@ -159,6 +196,11 @@ void MaterialInstance::setParameter(const char* name, T value) noexcept { upcast(this)->setParameter(name, value); } +template +void MaterialInstance::setParameter(const char* name, const T* value, size_t count) noexcept { + upcast(this)->setParameter(name, value, count); +} + // explicit template instantiation of our supported types template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, bool v); template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, float v); @@ -178,13 +220,6 @@ template UTILS_PUBLIC void MaterialInstance::setParameter (const char* template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, float4 v); template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, mat3f v); template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, mat4f v); - -template -void MaterialInstance::setParameter(const char* name, const T* value, size_t count) noexcept { - upcast(this)->setParameter(name, value, count); -} - -// explicit template instantiation of our supported types template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, const bool *v, size_t c); template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, const float *v, size_t c); template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, const int32_t *v, size_t c);