Fix linkage errors

FMaterialInstance::setParameter<> template needs to be accessible from
other modules.
This commit is contained in:
Mathias Agopian
2019-05-07 18:35:19 -07:00
committed by Mathias Agopian
parent e7749c59ce
commit 64afe136f6
2 changed files with 46 additions and 11 deletions
+2 -2
View File
@@ -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());
+44 -9
View File
@@ -117,8 +117,7 @@ void FMaterialInstance::commitSlow(FEngine& engine) const {
template<typename T>
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<T>(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<bool> (const char* name, bool v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float> (const char* name, float v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int32_t> (const char* name, int32_t v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint32_t>(const char* name, uint32_t v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool2> (const char* name, bool2 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool3> (const char* name, bool3 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool4> (const char* name, bool4 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int2> (const char* name, int2 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int3> (const char* name, int3 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int4> (const char* name, int4 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint2> (const char* name, uint2 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint3> (const char* name, uint3 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint4> (const char* name, uint4 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float2> (const char* name, float2 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float3> (const char* name, float3 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float4> (const char* name, float4 v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<mat3f> (const char* name, mat3f v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<mat4f> (const char* name, mat4f v);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool> (const char* name, const bool *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float> (const char* name, const float *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int32_t> (const char* name, const int32_t *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint32_t>(const char* name, const uint32_t *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool2> (const char* name, const bool2 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool3> (const char* name, const bool3 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<bool4> (const char* name, const bool4 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int2> (const char* name, const int2 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int3> (const char* name, const int3 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<int4> (const char* name, const int4 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint2> (const char* name, const uint2 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint3> (const char* name, const uint3 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<uint4> (const char* name, const uint4 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float2> (const char* name, const float2 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float3> (const char* name, const float3 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<float4> (const char* name, const float4 *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<mat3f> (const char* name, const mat3f *v, size_t c);
template UTILS_NOINLINE void FMaterialInstance::setParameter<mat4f> (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<T>(name, value);
}
template <typename T>
void MaterialInstance::setParameter(const char* name, const T* value, size_t count) noexcept {
upcast(this)->setParameter<T>(name, value, count);
}
// explicit template instantiation of our supported types
template UTILS_PUBLIC void MaterialInstance::setParameter<bool> (const char* name, bool v);
template UTILS_PUBLIC void MaterialInstance::setParameter<float> (const char* name, float v);
@@ -178,13 +220,6 @@ template UTILS_PUBLIC void MaterialInstance::setParameter<float3> (const char*
template UTILS_PUBLIC void MaterialInstance::setParameter<float4> (const char* name, float4 v);
template UTILS_PUBLIC void MaterialInstance::setParameter<mat3f> (const char* name, mat3f v);
template UTILS_PUBLIC void MaterialInstance::setParameter<mat4f> (const char* name, mat4f v);
template <typename T>
void MaterialInstance::setParameter(const char* name, const T* value, size_t count) noexcept {
upcast(this)->setParameter<T>(name, value, count);
}
// explicit template instantiation of our supported types
template UTILS_PUBLIC void MaterialInstance::setParameter<bool> (const char* name, const bool *v, size_t c);
template UTILS_PUBLIC void MaterialInstance::setParameter<float> (const char* name, const float *v, size_t c);
template UTILS_PUBLIC void MaterialInstance::setParameter<int32_t> (const char* name, const int32_t *v, size_t c);