X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene3d%2Fpublic-api%2Floader%2Fgltf2-loader.cpp;h=90002b369b33cbec5a9334d18e72dda0403f9da8;hb=d124a23dd94e5119147b127286d2e5ad687f0efd;hp=257ba321495289e3b6ef772ff4339f9d42a6c5d4;hpb=7ed28ea060e0aa21cb36ed605d6c7d0f85397f6a;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene3d/public-api/loader/gltf2-loader.cpp b/dali-scene3d/public-api/loader/gltf2-loader.cpp index 257ba32..90002b3 100644 --- a/dali-scene3d/public-api/loader/gltf2-loader.cpp +++ b/dali-scene3d/public-api/loader/gltf2-loader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -22,6 +22,7 @@ #include #include #include +#include #include // INTERNAL INCLUDES @@ -43,6 +44,9 @@ namespace Loader { namespace { +Dali::Mutex gInitializeMutex; +Dali::Mutex gReadMutex; + const std::string POSITION_PROPERTY("position"); const std::string ORIENTATION_PROPERTY("orientation"); const std::string SCALE_PROPERTY("scale"); @@ -76,9 +80,6 @@ struct AttributeMapping std::vector ReadAnimationArray(const json_value_s& j) { - gt::Animation proxy; - SetRefReaderObject(proxy); - auto results = js::Read::Array::Read>(j); for(auto& animation : results) @@ -425,9 +426,9 @@ SamplerFlags::Type ConvertSampler(const gt::Ref& s) { if(s) { - return ((s->mMinFilter < gt::Filter::NEAREST_MIPMAP_NEAREST) ? (s->mMinFilter - gt::Filter::NEAREST) : ((s->mMinFilter - gt::Filter::NEAREST_MIPMAP_NEAREST) + 2)) | - ((s->mMagFilter - gt::Filter::NEAREST) << SamplerFlags::FILTER_MAG_SHIFT) | - (ConvertWrapMode(s->mWrapS) << SamplerFlags::WRAP_S_SHIFT) | + return ((s->mMinFilter < gt::Filter::NEAREST_MIPMAP_NEAREST) ? (s->mMinFilter - gt::Filter::NEAREST) : ((s->mMinFilter - gt::Filter::NEAREST_MIPMAP_NEAREST) + 2)) | + ((s->mMagFilter - gt::Filter::NEAREST) << SamplerFlags::FILTER_MAG_SHIFT) | + (ConvertWrapMode(s->mWrapS) << SamplerFlags::WRAP_S_SHIFT) | (ConvertWrapMode(s->mWrapT) << SamplerFlags::WRAP_T_SHIFT); } else @@ -669,7 +670,8 @@ void ConvertMeshes(const gt::Document& doc, ConversionContext& context) if(iFind->first == gt::Attribute::JOINTS_0) { meshDefinition.mFlags |= (iFind->second->mComponentType == gt::Component::UNSIGNED_SHORT) * MeshDefinition::U16_JOINT_IDS; - DALI_ASSERT_DEBUG(MaskMatch(meshDefinition.mFlags, MeshDefinition::U16_JOINT_IDS) || iFind->second->mComponentType == gt::Component::FLOAT); + meshDefinition.mFlags |= (iFind->second->mComponentType == gt::Component::UNSIGNED_BYTE) * MeshDefinition::U8_JOINT_IDS; + DALI_ASSERT_DEBUG(MaskMatch(meshDefinition.mFlags, MeshDefinition::U16_JOINT_IDS) || MaskMatch(meshDefinition.mFlags, MeshDefinition::U8_JOINT_IDS) || iFind->second->mComponentType == gt::Component::FLOAT); } } else if(needNormalsTangents) @@ -953,7 +955,7 @@ float LoadKeyFrames(const std::string& path, const gt::Animation::Channel& chann Vector inputDataBuffer; Vector outputDataBuffer; - const float duration = LoadDataFromAccessors(path, input, output, inputDataBuffer, outputDataBuffer); + const float duration = std::max(LoadDataFromAccessors(path, input, output, inputDataBuffer, outputDataBuffer), AnimationDefinition::MIN_DURATION_SECONDS); for(uint32_t i = 0; i < input.mCount; ++i) { @@ -1029,8 +1031,8 @@ void ConvertAnimations(const gt::Document& doc, ConversionContext& context) Index propertyIndex = 0u; for(const auto& channel : animation.mChannels) { - Index nodeIndex = context.mNodeIndices.GetRuntimeId(channel.mTarget.mNode.GetIndex()); - float duration = 0.f; + Index nodeIndex = context.mNodeIndices.GetRuntimeId(channel.mTarget.mNode.GetIndex()); + float duration = 0.f; switch(channel.mTarget.mPath) { @@ -1230,6 +1232,21 @@ void SetDefaultEnvironmentMap(const gt::Document& doc, ConversionContext& contex } // namespace +void InitializeGltfLoader() +{ + // Set ObjectReader only once (for all gltf loading). + static bool setObjectReadersRequired = true; + { + Mutex::ScopedLock lock(gInitializeMutex); + if(setObjectReadersRequired) + { + // NOTE: only referencing own, anonymous namespace, const objects; the pointers will never need to change. + SetObjectReaders(); + setObjectReadersRequired = false; + } + } +} + void LoadGltfScene(const std::string& url, ShaderDefinitionFactory& shaderFactory, LoadResult& params) { bool failed = false; @@ -1245,14 +1262,6 @@ void LoadGltfScene(const std::string& url, ShaderDefinitionFactory& shaderFactor throw std::runtime_error("Failed to parse " + url); } - static bool setObjectReaders = true; - if(setObjectReaders) - { - // NOTE: only referencing own, anonymous namespace, const objects; the pointers will never need to change. - SetObjectReaders(); - setObjectReaders = false; - } - gt::Document doc; auto& rootObj = js::Cast(*root); @@ -1272,8 +1281,11 @@ void LoadGltfScene(const std::string& url, ShaderDefinitionFactory& shaderFactor isMRendererModel = (doc.mAsset.mGenerator.find(MRENDERER_MODEL_IDENTIFICATION) != std::string_view::npos); } - gt::SetRefReaderObject(doc); - DOCUMENT_READER.Read(rootObj, doc); + { + Mutex::ScopedLock lock(gReadMutex); + gt::SetRefReaderObject(doc); + DOCUMENT_READER.Read(rootObj, doc); + } auto path = url.substr(0, url.rfind('/') + 1); ConversionContext context{params, path, INVALID_INDEX};