Merge "USD model support in Scene3D" into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Thu, 26 Sep 2024 13:41:09 +0000 (13:41 +0000)
committerGerrit Code Review <gerrit@review>
Thu, 26 Sep 2024 13:41:09 +0000 (13:41 +0000)
1  2 
dali-scene3d/public-api/loader/material-definition.cpp

index 83bd0aada5b780d3a1e5bd2852a6a1a1030343cc,e97c7b6ee6b5e9f62358e4f5d7380ed5e28ceafe..31f14b11b41fa931ad3e60d733b908b16893be32
@@@ -277,9 -336,75 +329,75 @@@ MaterialDefinition::LoadRaw(const std::
      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,