X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene3d%2Fpublic-api%2Floader%2Fmaterial-definition.cpp;h=eb83f23aadd873509760c66873981e6f7d146243;hb=5c75b9376dd7577a927e9aad797479e1cd831e11;hp=f69ff7225e100878cf815e9cdc15ca2a69f71737;hpb=14aae6478c857beb485a2fd6245e76cb00f420ed;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene3d/public-api/loader/material-definition.cpp b/dali-scene3d/public-api/loader/material-definition.cpp index f69ff72..eb83f23 100644 --- a/dali-scene3d/public-api/loader/material-definition.cpp +++ b/dali-scene3d/public-api/loader/material-definition.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 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. @@ -20,8 +20,12 @@ // EXTERNAL INCLUDES #include -#include #include +#include +#include + +// INTERNAL INCLUDES +#include namespace Dali { @@ -31,6 +35,8 @@ namespace Scene3D { namespace Loader { +const Matrix3 TextureDefinition::DEFAULT_TRANSFORM = Matrix3(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); + namespace { constexpr SamplerFlags::Type FILTER_MODES_FROM_DALI[]{ @@ -103,13 +109,14 @@ Dali::PixelData LoadImageResource(const std::string& resourcePath, Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromBuffer(reinterpret_cast(buffer.data()), bufferSize, textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection); if(pixelBuffer) { - pixelData = Devel::PixelBuffer::Convert(pixelBuffer); + pixelData = Dali::Devel::PixelBuffer::Convert(pixelBuffer, true); } } } else { - pixelData = SyncImageLoader::Load(resourcePath + textureDefinition.mImageUri, textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection); + textureDefinition.mDirectoryPath = resourcePath; + pixelData = Internal::ImageResourceLoader::GetCachedPixelData(resourcePath + textureDefinition.mImageUri, textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection); } return pixelData; } @@ -149,27 +156,30 @@ Sampler SamplerFlags::MakeSampler(Type flags) return sampler; } -TextureDefinition::TextureDefinition(const std::string& imageUri, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode) +TextureDefinition::TextureDefinition(const std::string& imageUri, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode, Matrix3 transform) : mImageUri(imageUri), mSamplerFlags(samplerFlags), mMinImageDimensions(minImageDimensions), - mSamplingMode(samplingMode) + mSamplingMode(samplingMode), + mTransform(transform) { } -TextureDefinition::TextureDefinition(std::string&& imageUri, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode) +TextureDefinition::TextureDefinition(std::string&& imageUri, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode, Matrix3 transform) : mImageUri(std::move(imageUri)), mSamplerFlags(samplerFlags), mMinImageDimensions(minImageDimensions), - mSamplingMode(samplingMode) + mSamplingMode(samplingMode), + mTransform(transform) { } -TextureDefinition::TextureDefinition(std::vector&& textureBuffer, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode) +TextureDefinition::TextureDefinition(std::vector&& textureBuffer, SamplerFlags::Type samplerFlags, ImageDimensions minImageDimensions, SamplingMode::Type samplingMode, Matrix3 transform) : mImageUri(), mSamplerFlags(samplerFlags), mMinImageDimensions(minImageDimensions), mSamplingMode(samplingMode), + mTransform(transform), mTextureBuffer(std::move(textureBuffer)) { } @@ -208,9 +218,7 @@ MaterialDefinition::LoadRaw(const std::string& imagesPath) } else // single value normal-roughness { - const auto bufferSize = 4; - uint8_t* buffer = new uint8_t[bufferSize]{0x7f, 0x7f, 0xff, 0xff}; // normal of (0, 0, 1), roughness of 1 - raw.mTextures.push_back({PixelData::New(buffer, bufferSize, 1, 1, Pixel::RGBA8888, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); + raw.mTextures.push_back({Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataZAxisAndAlphaRGBA(), GetSingleValueSampler()}); } } else @@ -244,7 +252,7 @@ MaterialDefinition::LoadRaw(const std::string& imagesPath) buffer[0] = static_cast(mColor.r * 255.f); buffer[1] = static_cast(mColor.g * 255.f); buffer[2] = static_cast(mColor.b * 255.f); - raw.mTextures.push_back({PixelData::New(buffer, bufferSize, 1, 1, format, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); + raw.mTextures.push_back({Dali::Integration::NewPixelDataWithReleaseAfterUpload(buffer, bufferSize, 1, 1, 0, format, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); } // If we have transparency, or an image based albedo map, we will have to continue with separate metallicRoughness + normal. @@ -258,9 +266,7 @@ MaterialDefinition::LoadRaw(const std::string& imagesPath) { // NOTE: we want to set both metallic and roughness to 1.0; dli uses the R & A channels, // glTF2 uses B & G, so we might as well just set all components to 1.0. - const auto bufferSize = 4; - uint8_t* buffer = new uint8_t[bufferSize]{0xff, 0xff, 0xff, 0xff}; - raw.mTextures.push_back({PixelData::New(buffer, bufferSize, 1, 1, Pixel::RGBA8888, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); + raw.mTextures.push_back({Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataWhiteRGBA(), GetSingleValueSampler()}); } if(checkStage(NORMAL)) @@ -272,15 +278,11 @@ MaterialDefinition::LoadRaw(const std::string& imagesPath) { if(createMetallicRoughnessAndNormal) { - const auto bufferSize = 3; - uint8_t* buffer = new uint8_t[bufferSize]{0x7f, 0x7f, 0xff}; // normal of (0, 0, 1) - raw.mTextures.push_back({PixelData::New(buffer, bufferSize, 1, 1, Pixel::RGB888, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); + raw.mTextures.push_back({Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataZAxisRGB(), GetSingleValueSampler()}); } else // single-value normal-roughness { - const auto bufferSize = 4; - uint8_t* buffer = new uint8_t[bufferSize]{0x7f, 0x7f, 0xff, 0xff}; // normal of (0, 0, 1), roughness of 1.0 - raw.mTextures.push_back({PixelData::New(buffer, bufferSize, 1, 1, Pixel::RGBA8888, PixelData::DELETE_ARRAY), GetSingleValueSampler()}); + raw.mTextures.push_back({Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyPixelDataZAxisAndAlphaRGBA(), GetSingleValueSampler()}); } } } @@ -330,12 +332,7 @@ TextureSet MaterialDefinition::Load(const EnvironmentDefinition::Vector& environ Texture texture; if(pixels) { - texture = Texture::New(TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight()); - texture.Upload(tData.mPixels, 0, 0, 0, 0, pixels.GetWidth(), pixels.GetHeight()); - if(tData.mSamplerFlags & SamplerFlags::MIPMAP_MASK) - { - texture.GenerateMipmaps(); - } + texture = Dali::Scene3D::Internal::ImageResourceLoader::GetCachedTexture(pixels, tData.mSamplerFlags & SamplerFlags::MIPMAP_MASK); } textureSet.SetTexture(n, texture); @@ -344,6 +341,11 @@ TextureSet MaterialDefinition::Load(const EnvironmentDefinition::Vector& environ ++n; } + if(mShadowAvailable) + { + textureSet.SetTexture(n++, Dali::Scene3D::Internal::ImageResourceLoader::GetEmptyTextureWhiteRGB()); + } + // Assign textures to slots -- starting with 2D ones, then cubemaps, if any. if(mEnvironmentIdx < static_cast(environments.size())) {