#include <dali-scene3d/public-api/loader/ktx-loader.h>
// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
#include <dali/integration-api/pixel-data-integ.h>
#include <dali/public-api/rendering/texture.h>
+#include <dali/devel-api/adaptor-framework/file-stream.h>
#include <fstream>
#include <memory>
bool LoadKtxData(const std::string& path, EnvironmentMapData& environmentMapData)
{
- std::fstream fp(path, std::ios::in | std::ios::binary);
- if(fp.is_open() == false)
+ Dali::FileStream fileStream(path, FileStream::READ | FileStream::BINARY);
+ auto& stream = fileStream.GetStream();
+ if(!stream.good() || !stream.rdbuf()->in_avail())
{
+ DALI_LOG_ERROR("Load ktx data failed, path : %s\n", path.c_str());
return false;
}
KtxFileHeader header;
- if(fp.read(reinterpret_cast<char*>(&header), sizeof(KtxFileHeader)).good() == false)
+ stream.clear();
+ stream.seekg(0u, stream.beg);
+ if(stream.read(reinterpret_cast<char*>(&header), sizeof(KtxFileHeader)).good() == false)
{
+ DALI_LOG_ERROR("Unable to read ktx header in file, %s\n", path.c_str());
return false;
}
if(!header.IsIdentifierValid())
{
+ DALI_LOG_ERROR("KTX Header Identifier is not valid, %s\n", path.c_str());
return false;
}
// Skip the key-values:
- if(fp.seekg(static_cast<std::streamoff>(static_cast<std::size_t>(header.bytesOfKeyValueData)), fp.cur).good() == false)
+ if(stream.seekg(static_cast<std::streamoff>(static_cast<std::size_t>(header.bytesOfKeyValueData)), stream.cur).good() == false)
{
+ DALI_LOG_ERROR("Unable to skip key-values in KTX file, %s\n", path.c_str());
return false;
}
for(uint32_t mipmapLevel = 0u; mipmapLevel < header.numberOfMipmapLevels; ++mipmapLevel)
{
uint32_t byteSize = 0u;
- if(fp.read(reinterpret_cast<char*>(&byteSize), sizeof(byteSize)).good() == false)
+ if(stream.read(reinterpret_cast<char*>(&byteSize), sizeof(byteSize)).good() == false)
{
+ DALI_LOG_ERROR("Unable to read byteSize from KTX stream, %s\n", path.c_str());
return false;
}
for(uint32_t face = 0u; face < header.numberOfFaces; ++face)
{
std::unique_ptr<uint8_t, void (*)(uint8_t*)> img(new uint8_t[byteSize], FreeBuffer);
- if(fp.read(reinterpret_cast<char*>(img.get()), static_cast<std::streamsize>(static_cast<size_t>(byteSize))).good() == false)
+ if(stream.read(reinterpret_cast<char*>(img.get()), static_cast<std::streamsize>(static_cast<size_t>(byteSize))).good() == false)
{
+ DALI_LOG_ERROR("Unable to read data from KTX stream, %s\n", path.c_str());
return false;
}
environmentMapData.mPixelData[face][mipmapLevel] = Dali::Integration::NewPixelDataWithReleaseAfterUpload(img.release(), byteSize, header.pixelWidth, header.pixelHeight, 0u, daliformat, PixelData::DELETE_ARRAY);
MeshDefinition::RawData& rawData;
MeshDefinition::Accessor& accessor;
uint32_t flags;
- std::fstream& fileStream;
+ std::iostream* fileStream;
std::string& meshPath;
BufferDefinition::Vector& buffers;
};
MeshDefinition::RawData& rawData;
std::vector<MeshDefinition::Accessor>& accessors;
uint32_t flags;
- std::fstream& fileStream;
+ std::iostream* fileStream;
std::string& meshPath;
BufferDefinition::Vector& buffers;
};
}
}
-std::iostream& GetAvailableData(std::fstream& meshStream, const std::string& meshPath, BufferDefinition& buffer, std::string& availablePath)
+std::iostream& GetAvailableData(std::iostream* meshStream, const std::string& meshPath, BufferDefinition& buffer, std::string& availablePath)
{
- auto& stream = (meshStream.is_open()) ? meshStream : buffer.GetBufferStream();
- availablePath = (meshStream.is_open()) ? meshPath : buffer.GetUri();
+ auto& stream = meshStream ? *meshStream : buffer.GetBufferStream();
+ availablePath = meshStream ? meshPath : buffer.GetUri();
return stream;
}
auto& stream = GetAvailableData(indicesInput.fileStream, indicesInput.meshPath, indicesInput.buffers[indicesInput.accessor.mBufferIdx], path);
if(!ReadAccessor(indicesInput.accessor, stream, reinterpret_cast<uint8_t*>(indicesInput.rawData.mIndices.data())))
{
+ DALI_LOG_ERROR("Failed to read indices from %s\n", path.c_str());
ExceptionFlinger(ASSERT_LOCATION) << "Failed to read indices from '" << path << "'.";
}
}
auto& stream = GetAvailableData(indicesInput.fileStream, indicesInput.meshPath, indicesInput.buffers[indicesInput.accessor.mBufferIdx], path);
if(!ReadAccessor(indicesInput.accessor, stream, u8s))
{
+ DALI_LOG_ERROR("Failed to read indices from %s\n", path.c_str());
ExceptionFlinger(ASSERT_LOCATION) << "Failed to read indices from '" << path << "'.";
}
auto& stream = GetAvailableData(indicesInput.fileStream, indicesInput.meshPath, indicesInput.buffers[indicesInput.accessor.mBufferIdx], path);
if(!ReadAccessor(indicesInput.accessor, stream, reinterpret_cast<uint8_t*>(indicesInput.rawData.mIndices.data())))
{
+ DALI_LOG_ERROR("Failed to read indices from %s\n", path.c_str());
ExceptionFlinger(ASSERT_LOCATION) << "Failed to read indicesInput.accessor from '" << path << "'.";
}
}
colorsInput.rawData.mAttribs.push_back({"aVertexColor", propertyType, static_cast<uint32_t>(bufferSize / propertySize), std::move(buffer)});
}
}
- else
+ else if(!colorsInput.rawData.mAttribs.empty())
{
std::vector<uint8_t> buffer(colorsInput.rawData.mAttribs[0].mNumElements * sizeof(Vector4));
auto colors = reinterpret_cast<Vector4*>(buffer.data());
}
}
-void LoadBlendShapes(MeshDefinition::RawData& rawData, std::vector<MeshDefinition::BlendShape>& blendShapes, MeshDefinition::Blob& blendShapeHeader, BlendShapes::Version blendShapeVersion, uint32_t numberOfVertices, std::fstream& fileStream, BufferDefinition::Vector& buffers)
+void LoadBlendShapes(MeshDefinition::RawData& rawData, std::vector<MeshDefinition::BlendShape>& blendShapes, MeshDefinition::Blob& blendShapeHeader, BlendShapes::Version blendShapeVersion, uint32_t numberOfVertices, std::istream* fileStream, BufferDefinition::Vector& buffers)
{
// Calculate the Blob for the blend shapes.
MeshDefinition::Blob blendShapesBlob;
CalculateTextureSize(totalTextureSize, textureWidth, textureHeight);
calculateGltf2BlendShapes = true;
}
- else
+ else if(fileStream)
{
uint16_t header[2u];
- ReadBlob(blendShapeHeader, fileStream, reinterpret_cast<uint8_t*>(header));
+ ReadBlob(blendShapeHeader, *fileStream, reinterpret_cast<uint8_t*>(header));
textureWidth = header[0u];
textureHeight = header[1u];
}
if(blendShapesBlob.IsDefined())
{
- if(ReadBlob(blendShapesBlob, fileStream, geometryBuffer))
+ if(fileStream && ReadBlob(blendShapesBlob, *fileStream, geometryBuffer))
{
unnormalizeFactorBlob.mOffset = blendShapesBlob.mOffset + blendShapesBlob.mLength;
}
}
// Read the unnormalize factors.
- if(unnormalizeFactorBlob.IsDefined())
+ if(unnormalizeFactorBlob.IsDefined() && fileStream)
{
- ReadBlob(unnormalizeFactorBlob, fileStream, reinterpret_cast<uint8_t*>(&rawData.mBlendShapeUnnormalizeFactor[0u]));
+ ReadBlob(unnormalizeFactorBlob, *fileStream, reinterpret_cast<uint8_t*>(&rawData.mBlendShapeUnnormalizeFactor[0u]));
}
}
rawData.mBlendShapeData = Devel::PixelBuffer::Convert(geometryPixelBuffer);
MeshDefinition::LoadRaw(const std::string& modelsPath, BufferDefinition::Vector& buffers)
{
RawData raw;
- if(IsQuad())
+ if (IsQuad())
{
return raw;
}
std::string meshPath;
meshPath = modelsPath + mUri;
- std::fstream fileStream;
- if(!mUri.empty())
+
+ std::unique_ptr<Dali::FileStream> daliFileStream(nullptr);
+ std::iostream* fileStream = nullptr;
+ if (!mUri.empty())
{
- fileStream.open(meshPath, std::ios::in | std::ios::binary);
- if(!fileStream.is_open())
+ daliFileStream.reset(new Dali::FileStream(meshPath, FileStream::READ | FileStream::BINARY));
+ fileStream = &daliFileStream->GetStream();
+ if(!fileStream->good() || !fileStream->rdbuf()->in_avail())
{
DALI_LOG_ERROR("Fail to open buffer from %s.\n", meshPath.c_str());
+ fileStream = nullptr;
}
}
/*
- * 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.
// EXTERNAL INCLUDES
#include <dali/public-api/animation/constraints.h>
#include <dali/public-api/common/vector-wrapper.h>
+#include <dali/devel-api/adaptor-framework/file-loader.h>
#include <stdarg.h>
#include <cstring>
#include <fstream>
std::string LoadTextFile(const char* path, bool* fail)
{
- std::ifstream inFile(path);
- if(inFile)
+ std::streampos fileSize;
+ Dali::Vector<char> fileContent;
+
+ if(FileLoader::ReadFile(path, fileSize, fileContent, FileLoader::TEXT))
{
- std::istreambuf_iterator<char> eos;
- std::istreambuf_iterator<char> i(inFile.rdbuf());
- return std::string(i, eos);
+ return std::string(fileContent.Begin(), fileSize);
}
else if(fail)
{