2 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-scene3d/public-api/loader/environment-definition.h>
22 #include <dali/devel-api/adaptor-framework/environment-variable.h>
23 #include <dali/devel-api/adaptor-framework/image-loading.h>
24 #include <dali/devel-api/threading/mutex.h>
27 #include <dali-scene3d/internal/common/image-resource-loader.h>
28 #include <dali-scene3d/public-api/loader/environment-map-loader.h>
29 #include <dali-scene3d/public-api/loader/utils.h>
33 #define TOKEN_STRING(x) #x
34 std::string GetDaliImagePath()
36 return (nullptr == DALI_IMAGE_DIR) ? Dali::EnvironmentVariable::GetEnvironmentVariable(TOKEN_STRING(DALI_IMAGE_DIR)) : DALI_IMAGE_DIR;
39 static constexpr float DEFAULT_INTENSITY = 1.0f;
41 } // unnamed namespace
43 namespace Dali::Scene3D::Loader
47 const char* PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME = "brdfLUT.png";
49 PixelData EnvironmentDefinition::mBrdfPixelData;
50 Texture EnvironmentDefinition::mBrdfTexture;
51 bool EnvironmentDefinition::mIsBrdfLoaded = false;
53 Dali::Texture EnvironmentDefinition::GetBrdfTexture()
61 mBrdfTexture = Texture::New(TextureType::TEXTURE_2D, mBrdfPixelData.GetPixelFormat(), mBrdfPixelData.GetWidth(), mBrdfPixelData.GetHeight());
62 mBrdfTexture.Upload(mBrdfPixelData);
67 EnvironmentDefinition::RawData
68 EnvironmentDefinition::LoadRaw(const std::string& environmentsPath)
71 auto loadFn = [&environmentsPath](const std::string& path, EnvironmentMapData& environmentMapData) {
74 environmentMapData.mPixelData.resize(6);
75 for(auto& face : environmentMapData.mPixelData)
77 face.push_back(Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataWhiteRGB());
79 environmentMapData.SetEnvironmentMapType(Dali::Scene3D::EnvironmentMapType::CUBEMAP);
81 else if(!LoadEnvironmentMap(environmentsPath + path, environmentMapData))
83 ExceptionFlinger(ASSERT_LOCATION) << "Failed to load cubemap texture from '" << path << "'.";
87 loadFn(mDiffuseMapPath, raw.mDiffuse);
88 loadFn(mSpecularMapPath, raw.mSpecular);
97 EnvironmentDefinition::Textures EnvironmentDefinition::Load(RawData&& raw)
101 // This texture should have 6 faces and only one mipmap
102 if(!raw.mDiffuse.mPixelData.empty())
104 textures.mDiffuse = raw.mDiffuse.GetTexture();
107 // This texture should have 6 faces and 6 mipmaps
108 if(!raw.mSpecular.mPixelData.empty())
110 textures.mSpecular = raw.mSpecular.GetTexture();
111 textures.mSpecularMipmapLevels = raw.mSpecular.GetMipmapLevels();
116 textures.mBrdf = GetBrdfTexture();
121 float EnvironmentDefinition::GetDefaultIntensity()
123 return DEFAULT_INTENSITY;
126 void EnvironmentDefinition::LoadBrdfTexture()
128 static Dali::Mutex mutex;
130 Mutex::ScopedLock lock(mutex);
133 Devel::PixelBuffer pixelBuffer = LoadImageFromFile(GetDaliImagePath() + PRE_COMPUTED_BRDF_TEXTURE_FILE_NAME);
136 mBrdfPixelData = Devel::PixelBuffer::Convert(pixelBuffer);
137 mIsBrdfLoaded = true;
143 } // namespace Dali::Scene3D::Loader