[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / public-api / loader / environment-definition.cpp
index 0c76617..9c74f23 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
+// CLASS HEADER
+#include <dali-scene3d/public-api/loader/environment-definition.h>
+
 // EXTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/environment-variable.h>
 #include <dali/devel-api/adaptor-framework/image-loading.h>
+#include <dali/devel-api/threading/mutex.h>
 
 // INTERNAL INCLUDES
-#include "dali-scene3d/public-api/loader/cube-map-loader.h"
-#include "dali-scene3d/public-api/loader/environment-definition.h"
-#include "dali-scene3d/public-api/loader/utils.h"
+#include <dali-scene3d/internal/common/image-resource-loader.h>
+#include <dali-scene3d/public-api/loader/environment-map-loader.h>
+#include <dali-scene3d/public-api/loader/utils.h>
 
 namespace
 {
@@ -33,33 +37,48 @@ std::string GetDaliImagePath()
 }
 
 static constexpr float DEFAULT_INTENSITY = 1.0f;
+
 } // unnamed namespace
 
-namespace Dali
-{
-namespace Scene3D
-{
-namespace Loader
+namespace Dali::Scene3D::Loader
 {
 namespace
 {
-const std::string PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME = "brdfLUT.png";
+const char* PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME = "brdfLUT.png";
+}
+PixelData EnvironmentDefinition::mBrdfPixelData;
+Texture   EnvironmentDefinition::mBrdfTexture;
+bool      EnvironmentDefinition::mIsBrdfLoaded = false;
+
+Dali::Texture EnvironmentDefinition::GetBrdfTexture()
+{
+  if(!mBrdfTexture)
+  {
+    if(!mIsBrdfLoaded)
+    {
+      LoadBrdfTexture();
+    }
+    mBrdfTexture = Texture::New(TextureType::TEXTURE_2D, mBrdfPixelData.GetPixelFormat(), mBrdfPixelData.GetWidth(), mBrdfPixelData.GetHeight());
+    mBrdfTexture.Upload(mBrdfPixelData);
+  }
+  return mBrdfTexture;
 }
 
 EnvironmentDefinition::RawData
-EnvironmentDefinition::LoadRaw(const std::string& environmentsPath) const
+EnvironmentDefinition::LoadRaw(const std::string& environmentsPath)
 {
   RawData raw;
-  auto    loadFn = [&environmentsPath](const std::string& path, CubeData& cd) {
+  auto    loadFn = [&environmentsPath](const std::string& path, EnvironmentMapData& environmentMapData) {
     if(path.empty())
     {
-      cd.data.resize(6);
-      for(auto& face : cd.data)
+      environmentMapData.mPixelData.resize(6);
+      for(auto& face : environmentMapData.mPixelData)
       {
-        face.push_back(PixelData::New(new uint8_t[3]{0xff, 0xff, 0xff}, 3, 1, 1, Pixel::RGB888, PixelData::DELETE_ARRAY));
+        face.push_back(Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataWhiteRGB());
       }
+      environmentMapData.SetEnvironmentMapType(Dali::Scene3D::EnvironmentMapType::CUBEMAP);
     }
-    else if(!LoadCubeMapData(environmentsPath + path, cd)) // TODO: supporting EQUIRECTANGULAR
+    else if(!LoadEnvironmentMap(environmentsPath + path, environmentMapData))
     {
       ExceptionFlinger(ASSERT_LOCATION) << "Failed to load cubemap texture from '" << path << "'.";
     }
@@ -70,35 +89,31 @@ EnvironmentDefinition::LoadRaw(const std::string& environmentsPath) const
 
   if(mUseBrdfTexture)
   {
-    Devel::PixelBuffer pixelBuffer = LoadImageFromFile(GetDaliImagePath() + PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME);
-    if(pixelBuffer)
-    {
-      raw.mBrdf = Devel::PixelBuffer::Convert(pixelBuffer);
-    }
+    LoadBrdfTexture();
   }
   return raw;
 }
 
-EnvironmentDefinition::Textures EnvironmentDefinition::Load(RawData&& raw) const
+EnvironmentDefinition::Textures EnvironmentDefinition::Load(RawData&& raw)
 {
   Textures textures;
 
   // This texture should have 6 faces and only one mipmap
-  if(!raw.mDiffuse.data.empty())
+  if(!raw.mDiffuse.mPixelData.empty())
   {
-    textures.mDiffuse = raw.mDiffuse.CreateTexture();
+    textures.mDiffuse = raw.mDiffuse.GetTexture();
   }
 
   // This texture should have 6 faces and 6 mipmaps
-  if(!raw.mSpecular.data.empty())
+  if(!raw.mSpecular.mPixelData.empty())
   {
-    textures.mSpecular = raw.mSpecular.CreateTexture();
+    textures.mSpecular             = raw.mSpecular.GetTexture();
+    textures.mSpecularMipmapLevels = raw.mSpecular.GetMipmapLevels();
   }
 
-  if(raw.mBrdf)
+  if(mUseBrdfTexture)
   {
-    textures.mBrdf = Texture::New(TextureType::TEXTURE_2D, raw.mBrdf.GetPixelFormat(), raw.mBrdf.GetWidth(), raw.mBrdf.GetHeight());
-    textures.mBrdf.Upload(raw.mBrdf);
+    textures.mBrdf = GetBrdfTexture();
   }
   return textures;
 }
@@ -108,6 +123,21 @@ float EnvironmentDefinition::GetDefaultIntensity()
   return DEFAULT_INTENSITY;
 }
 
-} // namespace Loader
-} // namespace Scene3D
-} // namespace Dali
+void EnvironmentDefinition::LoadBrdfTexture()
+{
+  static Dali::Mutex mutex;
+  {
+    Mutex::ScopedLock lock(mutex);
+    if(!mIsBrdfLoaded)
+    {
+      Devel::PixelBuffer pixelBuffer = LoadImageFromFile(GetDaliImagePath() + PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME);
+      if(pixelBuffer)
+      {
+        mBrdfPixelData = Devel::PixelBuffer::Convert(pixelBuffer);
+        mIsBrdfLoaded  = true;
+      }
+    }
+  }
+}
+
+} // namespace Dali::Scene3D::Loader
\ No newline at end of file