X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-scene-loader%2Fpublic-api%2Fmesh-definition.cpp;h=de37e309aba2d14f04b5a7807f51437eb4a10be4;hp=2cea9088519c81c37428a15d90191df51b02b7fe;hb=9cb1c71dcdff212c348c12567263a41c5803ace6;hpb=9e3fd659c4d25706ab65345bc7c562ac27248325 diff --git a/dali-scene-loader/public-api/mesh-definition.cpp b/dali-scene-loader/public-api/mesh-definition.cpp index 2cea908..de37e30 100644 --- a/dali-scene-loader/public-api/mesh-definition.cpp +++ b/dali-scene-loader/public-api/mesh-definition.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,9 +19,9 @@ #include "dali-scene-loader/public-api/mesh-definition.h" // EXTERNAL INCLUDES -#include "dali/devel-api/adaptor-framework/pixel-buffer.h" -#include #include +#include +#include "dali/devel-api/adaptor-framework/pixel-buffer.h" namespace Dali { @@ -29,7 +29,6 @@ namespace SceneLoader { namespace { - using Uint16Vector4 = uint16_t[4]; class IndexProvider @@ -38,7 +37,8 @@ public: IndexProvider(const uint16_t* indices) : mData(reinterpret_cast(indices)), mFunc(indices ? IncrementPointer : Increment) - {} + { + } uint16_t operator()() { @@ -53,40 +53,39 @@ private: static uint16_t IncrementPointer(uintptr_t& data) { - auto iPtr = reinterpret_cast(data); + auto iPtr = reinterpret_cast(data); auto result = *iPtr; - data = reinterpret_cast(++iPtr); + data = reinterpret_cast(++iPtr); return result; } uintptr_t mData; - uint16_t(*mFunc)(uintptr_t&); + uint16_t (*mFunc)(uintptr_t&); }; - const std::string QUAD("quad"); ///@brief Reads a blob from the given stream @a source into @a target, which must have /// at least @a descriptor.length bytes. bool ReadBlob(const MeshDefinition::Blob& descriptor, std::istream& source, uint8_t* target) { - if (!source.seekg(descriptor.mOffset, std::istream::beg)) + if(!source.seekg(descriptor.mOffset, std::istream::beg)) { return false; } - if (descriptor.IsConsecutive()) + if(descriptor.IsConsecutive()) { return !!source.read(reinterpret_cast(target), descriptor.mLength); } else { DALI_ASSERT_DEBUG(descriptor.mStride > descriptor.mElementSizeHint); - const uint32_t diff = descriptor.mStride - descriptor.mElementSizeHint; - uint32_t readSize = 0; - while (readSize < descriptor.mLength && - source.read(reinterpret_cast(target), descriptor.mElementSizeHint) && - source.seekg(diff, std::istream::cur)) + const uint32_t diff = descriptor.mStride - descriptor.mElementSizeHint; + uint32_t readSize = 0; + while(readSize < descriptor.mLength && + source.read(reinterpret_cast(target), descriptor.mElementSizeHint) && + source.seekg(diff, std::istream::cur)) { readSize += descriptor.mStride; target += descriptor.mElementSizeHint; @@ -95,11 +94,11 @@ bool ReadBlob(const MeshDefinition::Blob& descriptor, std::istream& source, uint } } -template +template void ReadValues(const std::vector& valuesBuffer, const std::vector& indicesBuffer, uint8_t* target, uint32_t count, uint32_t elementSizeHint) { const T* const indicesPtr = reinterpret_cast(indicesBuffer.data()); - for (uint32_t index = 0u; index < count; ++index) + for(uint32_t index = 0u; index < count; ++index) { uint32_t valuesIndex = indicesPtr[index] * elementSizeHint; memcpy(target + valuesIndex, &valuesBuffer[index * elementSizeHint], elementSizeHint); @@ -110,60 +109,60 @@ bool ReadAccessor(const MeshDefinition::Accessor& accessor, std::istream& source { bool success = false; - if (accessor.mBlob.IsDefined()) + if(accessor.mBlob.IsDefined()) { success = ReadBlob(accessor.mBlob, source, target); - if (!success) + if(!success) { return false; } } - if (accessor.mSparse) + if(accessor.mSparse) { const MeshDefinition::Blob& indices = accessor.mSparse->mIndices; - const MeshDefinition::Blob& values = accessor.mSparse->mValues; + const MeshDefinition::Blob& values = accessor.mSparse->mValues; - if (!indices.IsDefined() || !values.IsDefined()) + if(!indices.IsDefined() || !values.IsDefined()) { return false; } - const auto indicesBufferSize = indices.GetBufferSize(); + const auto indicesBufferSize = indices.GetBufferSize(); std::vector indicesBuffer(indicesBufferSize); success = ReadBlob(indices, source, indicesBuffer.data()); - if (!success) + if(!success) { return false; } - const auto valuesBufferSize = values.GetBufferSize(); + const auto valuesBufferSize = values.GetBufferSize(); std::vector valuesBuffer(valuesBufferSize); success = ReadBlob(values, source, valuesBuffer.data()); - if (!success) + if(!success) { return false; } - switch (indices.mElementSizeHint) - { - case 1u: + switch(indices.mElementSizeHint) { - ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); - break; - } - case 2u: - { - ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); - break; - } - case 4u: - { - ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); - break; - } - default: - DALI_ASSERT_DEBUG(!"Unsupported type for an index"); + case 1u: + { + ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); + break; + } + case 2u: + { + ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); + break; + } + case 4u: + { + ReadValues(valuesBuffer, indicesBuffer, target, accessor.mSparse->mCount, values.mElementSizeHint); + break; + } + default: + DALI_ASSERT_DEBUG(!"Unsupported type for an index"); } } @@ -173,7 +172,7 @@ bool ReadAccessor(const MeshDefinition::Accessor& accessor, std::istream& source void GenerateNormals(MeshDefinition::RawData& raw) { auto& attribs = raw.mAttribs; - DALI_ASSERT_DEBUG(attribs.size() > 0); // positions + DALI_ASSERT_DEBUG(attribs.size() > 0); // positions IndexProvider getIndex(raw.mIndices.data()); const uint32_t numIndices = raw.mIndices.empty() ? attribs[0].mNumElements : raw.mIndices.size(); @@ -181,12 +180,12 @@ void GenerateNormals(MeshDefinition::RawData& raw) auto* positions = reinterpret_cast(attribs[0].mData.data()); std::vector buffer(attribs[0].mNumElements * sizeof(Vector3)); - auto normals = reinterpret_cast(buffer.data()); + auto normals = reinterpret_cast(buffer.data()); - for (uint32_t i = 0; i < numIndices; i += 3) + for(uint32_t i = 0; i < numIndices; i += 3) { - uint16_t indices[]{ getIndex(), getIndex(), getIndex() }; - Vector3 pos[]{ positions[indices[0]], positions[indices[1]], positions[indices[2]] }; + uint16_t indices[]{getIndex(), getIndex(), getIndex()}; + Vector3 pos[]{positions[indices[0]], positions[indices[1]], positions[indices[2]]}; Vector3 a = pos[1] - pos[0]; Vector3 b = pos[2] - pos[0]; @@ -198,34 +197,34 @@ void GenerateNormals(MeshDefinition::RawData& raw) } auto iEnd = normals + attribs[0].mNumElements; - while (normals != iEnd) + while(normals != iEnd) { normals->Normalize(); ++normals; } - attribs.push_back({ "aNormal", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer) }); + attribs.push_back({"aNormal", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer)}); } void GenerateTangentsWithUvs(MeshDefinition::RawData& raw) { auto& attribs = raw.mAttribs; - DALI_ASSERT_DEBUG(attribs.size() > 2); // positions, normals, uvs + DALI_ASSERT_DEBUG(attribs.size() > 2); // positions, normals, uvs IndexProvider getIndex(raw.mIndices.data()); const uint32_t numIndices = raw.mIndices.empty() ? attribs[0].mNumElements : raw.mIndices.size(); auto* positions = reinterpret_cast(attribs[0].mData.data()); - auto* uvs = reinterpret_cast(attribs[2].mData.data()); + auto* uvs = reinterpret_cast(attribs[2].mData.data()); std::vector buffer(attribs[0].mNumElements * sizeof(Vector3)); - auto tangents = reinterpret_cast(buffer.data()); + auto tangents = reinterpret_cast(buffer.data()); - for (uint32_t i = 0; i < numIndices; i += 3) + for(uint32_t i = 0; i < numIndices; i += 3) { - uint16_t indices[]{ getIndex(), getIndex(), getIndex() }; - Vector3 pos[]{ positions[indices[0]], positions[indices[1]], positions[indices[2]] }; - Vector2 uv[]{ uvs[indices[0]], uvs[indices[1]], uvs[indices[2]] }; + uint16_t indices[]{getIndex(), getIndex(), getIndex()}; + Vector3 pos[]{positions[indices[0]], positions[indices[1]], positions[indices[2]]}; + Vector2 uv[]{uvs[indices[0]], uvs[indices[1]], uvs[indices[2]]}; float x0 = pos[1].x - pos[0].x; float y0 = pos[1].y - pos[0].y; @@ -241,7 +240,7 @@ void GenerateTangentsWithUvs(MeshDefinition::RawData& raw) float s1 = uv[2].x - uv[0].x; float t1 = uv[2].y - uv[0].y; - float r = 1.f / (s0 * t1 - t0 * s1); + float r = 1.f / (s0 * t1 - t0 * s1); Vector3 tangent((x0 * t1 - t0 * x1) * r, (y0 * t1 - t0 * y1) * r, (z0 * t1 - t0 * z1) * r); tangents[indices[0]] += tangent; tangents[indices[1]] += tangent; @@ -249,8 +248,8 @@ void GenerateTangentsWithUvs(MeshDefinition::RawData& raw) } auto* normals = reinterpret_cast(attribs[1].mData.data()); - auto iEnd = normals + attribs[1].mNumElements; - while (normals != iEnd) + auto iEnd = normals + attribs[1].mNumElements; + while(normals != iEnd) { *tangents -= *normals * normals->Dot(*tangents); tangents->Normalize(); @@ -258,23 +257,23 @@ void GenerateTangentsWithUvs(MeshDefinition::RawData& raw) ++tangents; ++normals; } - attribs.push_back({ "aTangent", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer) }); + attribs.push_back({"aTangent", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer)}); } void GenerateTangents(MeshDefinition::RawData& raw) { auto& attribs = raw.mAttribs; - DALI_ASSERT_DEBUG(attribs.size() > 1); // positions, normals + DALI_ASSERT_DEBUG(attribs.size() > 1); // positions, normals auto* normals = reinterpret_cast(attribs[1].mData.data()); std::vector buffer(attribs[0].mNumElements * sizeof(Vector3)); - auto tangents = reinterpret_cast(buffer.data()); + auto tangents = reinterpret_cast(buffer.data()); auto iEnd = normals + attribs[1].mNumElements; - while (normals != iEnd) + while(normals != iEnd) { - Vector3 t[]{ normals->Cross(Vector3::XAXIS), normals->Cross(Vector3::YAXIS) }; + Vector3 t[]{normals->Cross(Vector3::XAXIS), normals->Cross(Vector3::YAXIS)}; *tangents = t[t[1].LengthSquared() > t[0].LengthSquared()]; *tangents -= *normals * normals->Dot(*tangents); @@ -283,7 +282,7 @@ void GenerateTangents(MeshDefinition::RawData& raw) ++tangents; ++normals; } - attribs.push_back({ "aTangent", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer) }); + attribs.push_back({"aTangent", Property::VECTOR3, attribs[0].mNumElements, std::move(buffer)}); } void CalculateTextureSize(uint32_t totalTextureSize, uint32_t& textureWidth, uint32_t& textureHeight) @@ -293,74 +292,74 @@ void CalculateTextureSize(uint32_t totalTextureSize, uint32_t& textureWidth, uin // Calculate the dimensions of the texture. // The total size of the texture is the length of the blend shapes blob. - textureWidth = 0u; + textureWidth = 0u; textureHeight = 0u; - if (0u == totalTextureSize) + if(0u == totalTextureSize) { // nothing to do. return; } - const uint32_t pow2 = static_cast(ceil(log2(totalTextureSize))); - const uint32_t powWidth = pow2 >> 1u; + const uint32_t pow2 = static_cast(ceil(log2(totalTextureSize))); + const uint32_t powWidth = pow2 >> 1u; const uint32_t powHeight = pow2 - powWidth; - textureWidth = 1u << powWidth; + textureWidth = 1u << powWidth; textureHeight = 1u << powHeight; } void CalculateGltf2BlendShapes(uint8_t* geometryBuffer, std::ifstream& binFile, const std::vector& blendShapes, uint32_t numberOfVertices, float& blendShapeUnnormalizeFactor) { uint32_t geometryBufferIndex = 0u; - float maxDistance = 0.f; - Vector3* geometryBufferV3 = reinterpret_cast(geometryBuffer); - for (const auto& blendShape : blendShapes) + float maxDistance = 0.f; + Vector3* geometryBufferV3 = reinterpret_cast(geometryBuffer); + for(const auto& blendShape : blendShapes) { - if (blendShape.deltas.IsDefined()) + if(blendShape.deltas.IsDefined()) { DALI_ASSERT_ALWAYS(((blendShape.deltas.mBlob.mLength % sizeof(Vector3) == 0u) || - blendShape.deltas.mBlob.mStride >= sizeof(Vector3)) && - "Blend Shape position buffer length not a multiple of element size"); + blendShape.deltas.mBlob.mStride >= sizeof(Vector3)) && + "Blend Shape position buffer length not a multiple of element size"); - const auto bufferSize = blendShape.deltas.mBlob.GetBufferSize(); + const auto bufferSize = blendShape.deltas.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (ReadAccessor(blendShape.deltas, binFile, buffer.data())) + if(ReadAccessor(blendShape.deltas, binFile, buffer.data())) { blendShape.deltas.mBlob.ApplyMinMax(bufferSize / sizeof(Vector3), reinterpret_cast(buffer.data())); // Calculate the difference with the original mesh. // Find the max distance to normalize the deltas. const Vector3* const deltasBuffer = reinterpret_cast(buffer.data()); - for (uint32_t index = 0u; index < numberOfVertices; ++index) + for(uint32_t index = 0u; index < numberOfVertices; ++index) { Vector3& delta = geometryBufferV3[geometryBufferIndex++]; - delta = deltasBuffer[index]; + delta = deltasBuffer[index]; maxDistance = std::max(maxDistance, delta.LengthSquared()); } } } - if (blendShape.normals.IsDefined()) + if(blendShape.normals.IsDefined()) { DALI_ASSERT_ALWAYS(((blendShape.normals.mBlob.mLength % sizeof(Vector3) == 0u) || - blendShape.normals.mBlob.mStride >= sizeof(Vector3)) && - "Blend Shape normals buffer length not a multiple of element size"); + blendShape.normals.mBlob.mStride >= sizeof(Vector3)) && + "Blend Shape normals buffer length not a multiple of element size"); - const auto bufferSize = blendShape.normals.mBlob.GetBufferSize(); + const auto bufferSize = blendShape.normals.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (ReadAccessor(blendShape.normals, binFile, buffer.data())) + if(ReadAccessor(blendShape.normals, binFile, buffer.data())) { blendShape.normals.mBlob.ApplyMinMax(bufferSize / sizeof(Vector3), reinterpret_cast(buffer.data())); // Calculate the difference with the original mesh, and translate to make all values positive. const Vector3* const deltasBuffer = reinterpret_cast(buffer.data()); - for (uint32_t index = 0u; index < numberOfVertices; ++index) + for(uint32_t index = 0u; index < numberOfVertices; ++index) { Vector3& delta = geometryBufferV3[geometryBufferIndex++]; - delta = deltasBuffer[index]; + delta = deltasBuffer[index]; delta.x *= 0.5f; delta.y *= 0.5f; @@ -373,25 +372,25 @@ void CalculateGltf2BlendShapes(uint8_t* geometryBuffer, std::ifstream& binFile, } } - if (blendShape.tangents.IsDefined()) + if(blendShape.tangents.IsDefined()) { DALI_ASSERT_ALWAYS(((blendShape.tangents.mBlob.mLength % sizeof(Vector3) == 0u) || - blendShape.tangents.mBlob.mStride >= sizeof(Vector3)) && - "Blend Shape tangents buffer length not a multiple of element size"); + blendShape.tangents.mBlob.mStride >= sizeof(Vector3)) && + "Blend Shape tangents buffer length not a multiple of element size"); - const auto bufferSize = blendShape.tangents.mBlob.GetBufferSize(); + const auto bufferSize = blendShape.tangents.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (ReadAccessor(blendShape.tangents, binFile, buffer.data())) + if(ReadAccessor(blendShape.tangents, binFile, buffer.data())) { blendShape.tangents.mBlob.ApplyMinMax(bufferSize / sizeof(Vector3), reinterpret_cast(buffer.data())); // Calculate the difference with the original mesh, and translate to make all values positive. const Vector3* const deltasBuffer = reinterpret_cast(buffer.data()); - for (uint32_t index = 0u; index < numberOfVertices; ++index) + for(uint32_t index = 0u; index < numberOfVertices; ++index) { Vector3& delta = geometryBufferV3[geometryBufferIndex++]; - delta = deltasBuffer[index]; + delta = deltasBuffer[index]; delta.x *= 0.5f; delta.y *= 0.5f; @@ -406,81 +405,82 @@ void CalculateGltf2BlendShapes(uint8_t* geometryBuffer, std::ifstream& binFile, } geometryBufferIndex = 0u; - for (const auto& blendShape : blendShapes) + for(const auto& blendShape : blendShapes) { // Normalize all the deltas and translate to a possitive value. // Deltas are going to be passed to the shader in a color texture // whose values that are less than zero are clamped. - if (blendShape.deltas.IsDefined()) + if(blendShape.deltas.IsDefined()) { - const float normalizeFactor = (fabsf(maxDistance) < Math::MACHINE_EPSILON_1000) ? 1.f : (0.5f / sqrtf(maxDistance)); - for (uint32_t index = 0u; index < numberOfVertices; ++index) + for(uint32_t index = 0u; index < numberOfVertices; ++index) { Vector3& delta = geometryBufferV3[geometryBufferIndex++]; - delta.x = Clamp(((delta.x * normalizeFactor) + 0.5f), 0.f, 1.f); - delta.y = Clamp(((delta.y * normalizeFactor) + 0.5f), 0.f, 1.f); - delta.z = Clamp(((delta.z * normalizeFactor) + 0.5f), 0.f, 1.f); + delta.x = Clamp(((delta.x * normalizeFactor) + 0.5f), 0.f, 1.f); + delta.y = Clamp(((delta.y * normalizeFactor) + 0.5f), 0.f, 1.f); + delta.z = Clamp(((delta.z * normalizeFactor) + 0.5f), 0.f, 1.f); } // Calculate and store the unnormalize factor. blendShapeUnnormalizeFactor = 1.f / normalizeFactor; } - if (blendShape.normals.IsDefined()) + if(blendShape.normals.IsDefined()) { geometryBufferIndex += numberOfVertices; } - if (blendShape.tangents.IsDefined()) + if(blendShape.tangents.IsDefined()) { geometryBufferIndex += numberOfVertices; } } } -} +} // namespace MeshDefinition::SparseBlob::SparseBlob(const Blob& indices, const Blob& values, uint32_t count) : mIndices{indices}, mValues{values}, mCount{count} -{} +{ +} -MeshDefinition::Accessor::Accessor(const MeshDefinition::Blob& blob, - const MeshDefinition::SparseBlob& sparse) +MeshDefinition::Accessor::Accessor(const MeshDefinition::Blob& blob, + const MeshDefinition::SparseBlob& sparse) : mBlob{blob}, mSparse{(sparse.mIndices.IsDefined() && sparse.mValues.IsDefined()) ? new SparseBlob{sparse} : nullptr} -{} +{ +} -void MeshDefinition::Blob::ApplyMinMax(const std::vector& min, const std::vector& max, - uint32_t count, float* values) +void MeshDefinition::Blob::ApplyMinMax(const std::vector& min, const std::vector& max, uint32_t count, float* values) { DALI_ASSERT_DEBUG(max.size() == min.size() || max.size() * min.size() == 0); const auto numComponents = std::max(min.size(), max.size()); - using ClampFn = void(*)(const float*, const float*, uint32_t, float&); - ClampFn clampFn = min.empty() ? - (max.empty() ? - static_cast(nullptr) : - [](const float* min, const float* max, uint32_t i, float& value) { - value = std::min(max[i], value); - }) : - (max.empty() ? - [](const float* min, const float* max, uint32_t i, float& value) { - value = std::max(min[i], value); - } : - [](const float* min, const float* max, uint32_t i, float& value) { - value = std::min(std::max(min[i], value), max[i]); - }); + using ClampFn = void (*)(const float*, const float*, uint32_t, float&); + ClampFn clampFn = min.empty() ? (max.empty() ? static_cast(nullptr) : [](const float* min, const float* max, uint32_t i, float& value) { + value = std::min(max[i], value); + }) + : (max.empty() ? [](const float* min, const float* max, uint32_t i, float& value) { + value = std::max(min[i], value); + } + : static_cast([](const float* min, const float* max, uint32_t i, float& value) { + value = std::min(std::max(min[i], value), max[i]); + })); + + if(!clampFn) + { + return; + } auto end = values + count * numComponents; - while (values != end) + while(values != end) { - auto nextElement = values + numComponents; - uint32_t i = 0; - while (values != nextElement) + auto nextElement = values + numComponents; + uint32_t i = 0; + while(values != nextElement) { clampFn(min.data(), max.data(), i, *values); ++values; @@ -496,7 +496,8 @@ MeshDefinition::Blob::Blob(uint32_t offset, uint32_t length, uint16_t stride, ui mElementSizeHint(elementSizeHint), mMin(min), mMax(max) -{} +{ +} uint32_t MeshDefinition::Blob::GetBufferSize() const { @@ -511,7 +512,7 @@ void MeshDefinition::Blob::ApplyMinMax(uint32_t count, float* values) const void MeshDefinition::RawData::Attrib::AttachBuffer(Geometry& g) const { Property::Map attribMap; - attribMap[mName] = mType; + attribMap[mName] = mType; VertexBuffer attribBuffer = VertexBuffer::New(attribMap); attribBuffer.SetData(mData.data(), mNumElements); @@ -544,39 +545,39 @@ void MeshDefinition::RequestTangents() } MeshDefinition::RawData - MeshDefinition::LoadRaw(const std::string& modelsPath) const +MeshDefinition::LoadRaw(const std::string& modelsPath) const { RawData raw; - if (IsQuad()) + if(IsQuad()) { return raw; } const std::string meshPath = modelsPath + mUri; - std::ifstream binFile(meshPath, std::ios::binary); - if (!binFile) + std::ifstream binFile(meshPath, std::ios::binary); + if(!binFile) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read geometry data from '" << meshPath << "'"; } - if (mIndices.IsDefined()) + if(mIndices.IsDefined()) { - if (MaskMatch(mFlags, U32_INDICES)) + if(MaskMatch(mFlags, U32_INDICES)) { DALI_ASSERT_ALWAYS(((mIndices.mBlob.mLength % sizeof(uint32_t) == 0) || - mIndices.mBlob.mStride >= sizeof(uint32_t)) && - "Index buffer length not a multiple of element size"); + mIndices.mBlob.mStride >= sizeof(uint32_t)) && + "Index buffer length not a multiple of element size"); const auto indexCount = mIndices.mBlob.GetBufferSize() / sizeof(uint32_t); - raw.mIndices.resize(indexCount * 2); // NOTE: we need space for uint32_ts initially. - if (!ReadAccessor(mIndices, binFile, reinterpret_cast(raw.mIndices.data()))) + raw.mIndices.resize(indexCount * 2); // NOTE: we need space for uint32_ts initially. + if(!ReadAccessor(mIndices, binFile, reinterpret_cast(raw.mIndices.data()))) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read indices from '" << meshPath << "'."; } auto u16s = raw.mIndices.data(); auto u32s = reinterpret_cast(raw.mIndices.data()); - auto end = u32s + indexCount; - while (u32s != end) + auto end = u32s + indexCount; + while(u32s != end) { *u16s = static_cast(*u32s); ++u16s; @@ -588,10 +589,10 @@ MeshDefinition::RawData else { DALI_ASSERT_ALWAYS(((mIndices.mBlob.mLength % sizeof(unsigned short) == 0) || - mIndices.mBlob.mStride >= sizeof(unsigned short)) && - "Index buffer length not a multiple of element size"); + mIndices.mBlob.mStride >= sizeof(unsigned short)) && + "Index buffer length not a multiple of element size"); raw.mIndices.resize(mIndices.mBlob.mLength / sizeof(unsigned short)); - if (!ReadAccessor(mIndices, binFile, reinterpret_cast(raw.mIndices.data()))) + if(!ReadAccessor(mIndices, binFile, reinterpret_cast(raw.mIndices.data()))) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read indices from '" << meshPath << "'."; } @@ -599,14 +600,14 @@ MeshDefinition::RawData } std::vector positions; - if (mPositions.IsDefined()) + if(mPositions.IsDefined()) { DALI_ASSERT_ALWAYS(((mPositions.mBlob.mLength % sizeof(Vector3) == 0) || - mPositions.mBlob.mStride >= sizeof(Vector3)) && - "Position buffer length not a multiple of element size"); - const auto bufferSize = mPositions.mBlob.GetBufferSize(); + mPositions.mBlob.mStride >= sizeof(Vector3)) && + "Position buffer length not a multiple of element size"); + const auto bufferSize = mPositions.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mPositions, binFile, buffer.data())) + if(!ReadAccessor(mPositions, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read positions from '" << meshPath << "'."; } @@ -614,35 +615,34 @@ MeshDefinition::RawData uint32_t numVector3 = bufferSize / sizeof(Vector3); mPositions.mBlob.ApplyMinMax(numVector3, reinterpret_cast(buffer.data())); - if (HasBlendShapes()) + if(HasBlendShapes()) { positions.resize(numVector3); std::copy(buffer.data(), buffer.data() + buffer.size(), reinterpret_cast(positions.data())); } - raw.mAttribs.push_back({ "aPosition", Property::VECTOR3, numVector3, std::move(buffer) }); + raw.mAttribs.push_back({"aPosition", Property::VECTOR3, numVector3, std::move(buffer)}); } const auto isTriangles = mPrimitiveType == Geometry::TRIANGLES; - auto hasNormals = mNormals.IsDefined(); - if (hasNormals) + auto hasNormals = mNormals.IsDefined(); + if(hasNormals) { DALI_ASSERT_ALWAYS(((mNormals.mBlob.mLength % sizeof(Vector3) == 0) || - mNormals.mBlob.mStride >= sizeof(Vector3)) && - "Normal buffer length not a multiple of element size"); - const auto bufferSize = mNormals.mBlob.GetBufferSize(); + mNormals.mBlob.mStride >= sizeof(Vector3)) && + "Normal buffer length not a multiple of element size"); + const auto bufferSize = mNormals.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mNormals, binFile, buffer.data())) + if(!ReadAccessor(mNormals, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read normals from '" << meshPath << "'."; } mNormals.mBlob.ApplyMinMax(bufferSize / sizeof(Vector3), reinterpret_cast(buffer.data())); - raw.mAttribs.push_back({ "aNormal", Property::VECTOR3, - static_cast(bufferSize / sizeof(Vector3)), std::move(buffer) }); + raw.mAttribs.push_back({"aNormal", Property::VECTOR3, static_cast(bufferSize / sizeof(Vector3)), std::move(buffer)}); } - else if (mNormals.mBlob.mLength != 0 && isTriangles) + else if(mNormals.mBlob.mLength != 0 && isTriangles) { DALI_ASSERT_DEBUG(mNormals.mBlob.mLength == mPositions.mBlob.GetBufferSize()); GenerateNormals(raw); @@ -650,24 +650,24 @@ MeshDefinition::RawData } const auto hasUvs = mTexCoords.IsDefined(); - if (hasUvs) + if(hasUvs) { DALI_ASSERT_ALWAYS(((mTexCoords.mBlob.mLength % sizeof(Vector2) == 0) || - mTexCoords.mBlob.mStride >= sizeof(Vector2)) && - "Normal buffer length not a multiple of element size"); - const auto bufferSize = mTexCoords.mBlob.GetBufferSize(); + mTexCoords.mBlob.mStride >= sizeof(Vector2)) && + "Normal buffer length not a multiple of element size"); + const auto bufferSize = mTexCoords.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mTexCoords, binFile, buffer.data())) + if(!ReadAccessor(mTexCoords, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read uv-s from '" << meshPath << "'."; } const auto uvCount = bufferSize / sizeof(Vector2); - if (MaskMatch(mFlags, FLIP_UVS_VERTICAL)) + if(MaskMatch(mFlags, FLIP_UVS_VERTICAL)) { - auto uv = reinterpret_cast(buffer.data()); + auto uv = reinterpret_cast(buffer.data()); auto uvEnd = uv + uvCount; - while (uv != uvEnd) + while(uv != uvEnd) { uv->y = 1.0f - uv->y; ++uv; @@ -676,89 +676,84 @@ MeshDefinition::RawData mTexCoords.mBlob.ApplyMinMax(bufferSize / sizeof(Vector2), reinterpret_cast(buffer.data())); - raw.mAttribs.push_back({ "aTexCoord", Property::VECTOR2, static_cast(uvCount), - std::move(buffer) }); + raw.mAttribs.push_back({"aTexCoord", Property::VECTOR2, static_cast(uvCount), std::move(buffer)}); } - if (mTangents.IsDefined()) + if(mTangents.IsDefined()) { DALI_ASSERT_ALWAYS(((mTangents.mBlob.mLength % sizeof(Vector3) == 0) || - mTangents.mBlob.mStride >= sizeof(Vector3)) && - "Tangents buffer length not a multiple of element size"); - const auto bufferSize = mTangents.mBlob.GetBufferSize(); + mTangents.mBlob.mStride >= sizeof(Vector3)) && + "Tangents buffer length not a multiple of element size"); + const auto bufferSize = mTangents.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mTangents, binFile, buffer.data())) + if(!ReadAccessor(mTangents, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read tangents from '" << meshPath << "'."; } mTangents.mBlob.ApplyMinMax(bufferSize / sizeof(Vector3), reinterpret_cast(buffer.data())); - raw.mAttribs.push_back({ "aTangent", Property::VECTOR3, - static_cast(bufferSize / sizeof(Vector3)), std::move(buffer) }); + raw.mAttribs.push_back({"aTangent", Property::VECTOR3, static_cast(bufferSize / sizeof(Vector3)), std::move(buffer)}); } - else if (mTangents.mBlob.mLength != 0 && hasNormals && isTriangles) + else if(mTangents.mBlob.mLength != 0 && hasNormals && isTriangles) { DALI_ASSERT_DEBUG(mTangents.mBlob.mLength == mNormals.mBlob.GetBufferSize()); hasUvs ? GenerateTangentsWithUvs(raw) : GenerateTangents(raw); } - if (IsSkinned()) + if(IsSkinned()) { - if (MaskMatch(mFlags, U16_JOINT_IDS)) + if(MaskMatch(mFlags, U16_JOINT_IDS)) { DALI_ASSERT_ALWAYS(((mJoints0.mBlob.mLength % sizeof(Uint16Vector4) == 0) || - mJoints0.mBlob.mStride >= sizeof(Uint16Vector4)) && - "Joints buffer length not a multiple of element size"); - const auto inBufferSize = mJoints0.mBlob.GetBufferSize(); + mJoints0.mBlob.mStride >= sizeof(Uint16Vector4)) && + "Joints buffer length not a multiple of element size"); + const auto inBufferSize = mJoints0.mBlob.GetBufferSize(); std::vector buffer(inBufferSize * 2); - auto u16s = buffer.data() + inBufferSize; - if (!ReadAccessor(mJoints0, binFile, u16s)) + auto u16s = buffer.data() + inBufferSize; + if(!ReadAccessor(mJoints0, binFile, u16s)) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read joints from '" << meshPath << "'."; } auto floats = reinterpret_cast(buffer.data()); - auto end = u16s + inBufferSize; - while (u16s != end) + auto end = u16s + inBufferSize; + while(u16s != end) { auto value = *reinterpret_cast(u16s); - *floats = static_cast(value); + *floats = static_cast(value); u16s += sizeof(uint16_t); ++floats; } - raw.mAttribs.push_back({ "aJoints", Property::VECTOR4, - static_cast(buffer.size() / sizeof(Vector4)), std::move(buffer) }); + raw.mAttribs.push_back({"aJoints", Property::VECTOR4, static_cast(buffer.size() / sizeof(Vector4)), std::move(buffer)}); } else { DALI_ASSERT_ALWAYS(((mJoints0.mBlob.mLength % sizeof(Vector4) == 0) || - mJoints0.mBlob.mStride >= sizeof(Vector4)) && - "Joints buffer length not a multiple of element size"); - const auto bufferSize = mJoints0.mBlob.GetBufferSize(); + mJoints0.mBlob.mStride >= sizeof(Vector4)) && + "Joints buffer length not a multiple of element size"); + const auto bufferSize = mJoints0.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mJoints0, binFile, buffer.data())) + if(!ReadAccessor(mJoints0, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read joints from '" << meshPath << "'."; } - raw.mAttribs.push_back({ "aJoints", Property::VECTOR4, - static_cast(bufferSize / sizeof(Vector4)), std::move(buffer) }); + raw.mAttribs.push_back({"aJoints", Property::VECTOR4, static_cast(bufferSize / sizeof(Vector4)), std::move(buffer)}); } DALI_ASSERT_ALWAYS(((mWeights0.mBlob.mLength % sizeof(Vector4) == 0) || - mWeights0.mBlob.mStride >= sizeof(Vector4)) && - "Weights buffer length not a multiple of element size"); - const auto bufferSize = mWeights0.mBlob.GetBufferSize(); + mWeights0.mBlob.mStride >= sizeof(Vector4)) && + "Weights buffer length not a multiple of element size"); + const auto bufferSize = mWeights0.mBlob.GetBufferSize(); std::vector buffer(bufferSize); - if (!ReadAccessor(mWeights0, binFile, buffer.data())) + if(!ReadAccessor(mWeights0, binFile, buffer.data())) { ExceptionFlinger(ASSERT_LOCATION) << "Failed to read weights from '" << meshPath << "'."; } - raw.mAttribs.push_back({ "aWeights", Property::VECTOR4, - static_cast(bufferSize / sizeof(Vector4)), std::move(buffer) }); + raw.mAttribs.push_back({"aWeights", Property::VECTOR4, static_cast(bufferSize / sizeof(Vector4)), std::move(buffer)}); } // Calculate the Blob for the blend shapes. @@ -766,11 +761,11 @@ MeshDefinition::RawData blendShapesBlob.mOffset = std::numeric_limits::max(); blendShapesBlob.mLength = 0u; - for (const auto& blendShape : mBlendShapes) + for(const auto& blendShape : mBlendShapes) { - for (auto i : { &blendShape.deltas, &blendShape.normals, &blendShape.tangents }) + for(auto i : {&blendShape.deltas, &blendShape.normals, &blendShape.tangents}) { - if (i->IsDefined()) + if(i->IsDefined()) { blendShapesBlob.mOffset = std::min(blendShapesBlob.mOffset, i->mBlob.mOffset); blendShapesBlob.mLength += i->mBlob.mLength; @@ -778,18 +773,18 @@ MeshDefinition::RawData } } - if (HasBlendShapes()) + if(HasBlendShapes()) { const uint32_t numberOfVertices = mPositions.mBlob.mLength / sizeof(Vector3); // Calculate the size of one buffer inside the texture. raw.mBlendShapeBufferOffset = numberOfVertices; - bool calculateGltf2BlendShapes = false; - uint32_t textureWidth = 0u; - uint32_t textureHeight = 0u; + bool calculateGltf2BlendShapes = false; + uint32_t textureWidth = 0u; + uint32_t textureHeight = 0u; - if (!mBlendShapeHeader.IsDefined()) + if(!mBlendShapeHeader.IsDefined()) { CalculateTextureSize(blendShapesBlob.mLength / sizeof(Vector3), textureWidth, textureHeight); calculateGltf2BlendShapes = true; @@ -798,7 +793,7 @@ MeshDefinition::RawData { uint16_t header[2u]; ReadBlob(mBlendShapeHeader, binFile, reinterpret_cast(header)); - textureWidth = header[0u]; + textureWidth = header[0u]; textureHeight = header[1u]; } @@ -806,9 +801,9 @@ MeshDefinition::RawData raw.mBlendShapeUnnormalizeFactor.Resize(numberOfBlendShapes); Devel::PixelBuffer geometryPixelBuffer = Devel::PixelBuffer::New(textureWidth, textureHeight, Pixel::RGB32F); - uint8_t* geometryBuffer = geometryPixelBuffer.GetBuffer(); + uint8_t* geometryBuffer = geometryPixelBuffer.GetBuffer(); - if (calculateGltf2BlendShapes) + if(calculateGltf2BlendShapes) { CalculateGltf2BlendShapes(geometryBuffer, binFile, mBlendShapes, numberOfVertices, raw.mBlendShapeUnnormalizeFactor[0u]); } @@ -817,16 +812,16 @@ MeshDefinition::RawData Blob unnormalizeFactorBlob; unnormalizeFactorBlob.mLength = sizeof(float) * ((BlendShapes::Version::VERSION_2_0 == mBlendShapeVersion) ? 1u : numberOfBlendShapes); - if (blendShapesBlob.IsDefined()) + if(blendShapesBlob.IsDefined()) { - if (ReadBlob(blendShapesBlob, binFile, geometryBuffer)) + if(ReadBlob(blendShapesBlob, binFile, geometryBuffer)) { unnormalizeFactorBlob.mOffset = blendShapesBlob.mOffset + blendShapesBlob.mLength; } } // Read the unnormalize factors. - if (unnormalizeFactorBlob.IsDefined()) + if(unnormalizeFactorBlob.IsDefined()) { ReadBlob(unnormalizeFactorBlob, binFile, reinterpret_cast(&raw.mBlendShapeUnnormalizeFactor[0u])); } @@ -843,32 +838,32 @@ MeshGeometry MeshDefinition::Load(RawData&& raw) const meshGeometry.geometry = Geometry::New(); meshGeometry.geometry.SetType(mPrimitiveType); - if (IsQuad()) // TODO: do this in raw data; provide MakeTexturedQuadGeometry() that only creates buffers. + if(IsQuad()) // TODO: do this in raw data; provide MakeTexturedQuadGeometry() that only creates buffers. { - auto options = MaskMatch(mFlags, FLIP_UVS_VERTICAL) ? TexturedQuadOptions::FLIP_VERTICAL : 0; + auto options = MaskMatch(mFlags, FLIP_UVS_VERTICAL) ? TexturedQuadOptions::FLIP_VERTICAL : 0; meshGeometry.geometry = MakeTexturedQuadGeometry(options); } else { - if (!raw.mIndices.empty()) + if(!raw.mIndices.empty()) { meshGeometry.geometry.SetIndexBuffer(raw.mIndices.data(), raw.mIndices.size()); } - for (auto& a : raw.mAttribs) + for(auto& a : raw.mAttribs) { a.AttachBuffer(meshGeometry.geometry); } - if (HasBlendShapes()) + if(HasBlendShapes()) { - meshGeometry.blendShapeBufferOffset = raw.mBlendShapeBufferOffset; + meshGeometry.blendShapeBufferOffset = raw.mBlendShapeBufferOffset; meshGeometry.blendShapeUnnormalizeFactor = std::move(raw.mBlendShapeUnnormalizeFactor); - meshGeometry.blendShapeGeometry = Texture::New( TextureType::TEXTURE_2D, - raw.mBlendShapeData.GetPixelFormat(), - raw.mBlendShapeData.GetWidth(), - raw.mBlendShapeData.GetHeight()); + meshGeometry.blendShapeGeometry = Texture::New(TextureType::TEXTURE_2D, + raw.mBlendShapeData.GetPixelFormat(), + raw.mBlendShapeData.GetWidth(), + raw.mBlendShapeData.GetHeight()); meshGeometry.blendShapeGeometry.Upload(raw.mBlendShapeData); } } @@ -876,5 +871,5 @@ MeshGeometry MeshDefinition::Load(RawData&& raw) const return meshGeometry; } -} -} +} // namespace SceneLoader +} // namespace Dali