const bool createMetallicRoughnessAndNormal = hasTransparency || std::distance(mTextureStages.begin(), iTexture) > 0;
if(checkStage(METALLIC | ROUGHNESS))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
+ else if(checkStage(METALLIC) || checkStage(ROUGHNESS))
+ {
+ // In some cases (e.g. USD model) it could have metallic texture and roughness texture separately,
+ // but what we want is a combined texture for both metallic and roughness.
+
+ Dali::Devel::PixelBuffer metallicTexture;
+ Dali::Devel::PixelBuffer roughnessTexture;
+ SamplerFlags::Type mMetallicSamplerFlags = SamplerFlags::DEFAULT;
+ SamplerFlags::Type mRoughnessSamplerFlags = SamplerFlags::DEFAULT;
+
+ if(checkStage(METALLIC))
+ {
+ if(!iTexture->mTexture.mTextureBuffer.empty())
+ {
+ metallicTexture = Dali::LoadImageFromBuffer(iTexture->mTexture.mTextureBuffer.data(), iTexture->mTexture.mTextureBuffer.size(), iTexture->mTexture.mMinImageDimensions, FittingMode::DEFAULT, iTexture->mTexture.mSamplingMode, true);
+ mMetallicSamplerFlags = iTexture->mTexture.mSamplingMode;
+ }
+
+ iTexture = mTextureStages.erase(iTexture);
+ }
+
+ if(checkStage(ROUGHNESS))
+ {
+ if(!iTexture->mTexture.mTextureBuffer.empty())
+ {
+ roughnessTexture = Dali::LoadImageFromBuffer(iTexture->mTexture.mTextureBuffer.data(), iTexture->mTexture.mTextureBuffer.size(), iTexture->mTexture.mMinImageDimensions, FittingMode::DEFAULT, iTexture->mTexture.mSamplingMode, true);
+ mRoughnessSamplerFlags = iTexture->mTexture.mSamplingMode;
+ }
+
+ iTexture = mTextureStages.erase(iTexture);
+ }
+
+ if(metallicTexture && roughnessTexture)
+ {
+ // If we have both metallic texture and roughness texture, combine them together as one metallic-roughness texture
+ // with roughness value in G channel and metallic value in B channel (to match what we support in our PBR shader).
+
+ Dali::Devel::PixelBuffer metallicRoughnessTexture;
+ uint32_t combinedBufferSize = CombineMetallicRoughnessTextures(metallicTexture, roughnessTexture, metallicRoughnessTexture);
+
+ uint8_t* metallicRoughnessBufferPtr = metallicRoughnessTexture.GetBuffer();
+ iTexture = mTextureStages.insert(iTexture, {MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS, TextureDefinition{std::vector<uint8_t>(metallicRoughnessBufferPtr, metallicRoughnessBufferPtr + combinedBufferSize)}});
+ ++iTexture;
+
+ raw.mTextures.push_back({Devel::PixelBuffer::Convert(metallicRoughnessTexture), mRoughnessSamplerFlags});
+ }
+ else
+ {
+ if(metallicTexture)
+ {
+ const uint8_t* metallicBufferPtr = metallicTexture.GetBuffer();
+ iTexture = mTextureStages.insert(iTexture, {MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS, TextureDefinition{std::vector<uint8_t>(metallicBufferPtr, metallicBufferPtr + metallicTexture.GetWidth() * metallicTexture.GetHeight() * Pixel::GetBytesPerPixel(metallicTexture.GetPixelFormat()))}});
+ ++iTexture;
+
+ raw.mTextures.push_back({Devel::PixelBuffer::Convert(metallicTexture), mMetallicSamplerFlags});
+ }
+ else if(roughnessTexture)
+ {
+ const uint8_t* roughnessBufferPtr = roughnessTexture.GetBuffer();
+ iTexture = mTextureStages.insert(iTexture, {MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS, TextureDefinition{std::vector<uint8_t>(roughnessBufferPtr, roughnessBufferPtr + roughnessTexture.GetWidth() * roughnessTexture.GetHeight() * Pixel::GetBytesPerPixel(roughnessTexture.GetPixelFormat()))}});
+ ++iTexture;
+
+ raw.mTextures.push_back({Devel::PixelBuffer::Convert(roughnessTexture), mRoughnessSamplerFlags});
+ }
+ }
+ }
else if(createMetallicRoughnessAndNormal && mNeedMetallicRoughnessTexture)
{
// NOTE: we want to set both metallic and roughness to 1.0; dli uses the R & A channels,