From 99ba0ba049d2690211b4cac9c2c4f497680d7db6 Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Wed, 1 Mar 2023 19:22:55 +0900 Subject: [PATCH] Make multiple roots model share the resources. Previous code generate new refcounts per each scene roots. If one model file has multiple roots, then each root didn't share there resouces each other. And also, due to the resource cache patch block multiple RawResouces loaded, multiple roots scene was not works well. This patch make we use only one refcounter per one model, So we can assume that we only load just one times if multi scene use same resources Change-Id: I752f8a4ed352d4c328b1f48791bf0fee4fc8adcb Signed-off-by: Eunki Hong --- dali-scene3d/internal/common/model-load-task.cpp | 22 ++++++++++++---------- dali-scene3d/internal/common/model-load-task.h | 6 +++--- .../internal/controls/model/model-impl.cpp | 7 +++---- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/dali-scene3d/internal/common/model-load-task.cpp b/dali-scene3d/internal/common/model-load-task.cpp index 4ee2864..aaec429 100644 --- a/dali-scene3d/internal/common/model-load-task.cpp +++ b/dali-scene3d/internal/common/model-load-task.cpp @@ -161,20 +161,22 @@ void ModelLoadTask::Process() { ConditionalWait::ScopedLock lock(loadRawResourceConditionalWait); + mResourceRefCount = std::move(mLoadResult.mResources.CreateRefCounter()); + for(auto iRoot : mLoadResult.mScene.GetRoots()) { - mResourceRefCounts.push_back(mLoadResult.mResources.CreateRefCounter()); - mLoadResult.mScene.CountResourceRefs(iRoot, mResourceChoices, mResourceRefCounts.back()); - mLoadResult.mResources.CountEnvironmentReferences(mResourceRefCounts.back()); + mLoadResult.mScene.CountResourceRefs(iRoot, mResourceChoices, mResourceRefCount); + } - mLoadResult.mResources.LoadRawResources(mResourceRefCounts.back(), pathProvider); + mLoadResult.mResources.CountEnvironmentReferences(mResourceRefCount); - // glTF Mesh is defined in right hand coordinate system, with positive Y for Up direction. - // Because DALi uses left hand system, Y direciton will be flipped for environment map sampling. - for(auto&& env : mLoadResult.mResources.mEnvironmentMaps) - { - env.first.mYDirection = Y_DIRECTION; - } + mLoadResult.mResources.LoadRawResources(mResourceRefCount, pathProvider); + + // glTF Mesh is defined in right hand coordinate system, with positive Y for Up direction. + // Because DALi uses left hand system, Y direciton will be flipped for environment map sampling. + for(auto&& env : mLoadResult.mResources.mEnvironmentMaps) + { + env.first.mYDirection = Y_DIRECTION; } } diff --git a/dali-scene3d/internal/common/model-load-task.h b/dali-scene3d/internal/common/model-load-task.h index 89d8ad0..bfafeb0 100644 --- a/dali-scene3d/internal/common/model-load-task.h +++ b/dali-scene3d/internal/common/model-load-task.h @@ -83,9 +83,9 @@ public: std::string mModelUrl; std::string mResourceDirectoryUrl; - Dali::Scene3D::Loader::Customization::Choices mResourceChoices; - std::vector mResourceRefCounts; - bool mHasSucceeded; + Dali::Scene3D::Loader::Customization::Choices mResourceChoices; + Dali::Scene3D::Loader::ResourceRefCounts mResourceRefCount; + bool mHasSucceeded; ModelCacheManager mModelCacheManager; Dali::Scene3D::Loader::LoadResult mLoadResult; diff --git a/dali-scene3d/internal/controls/model/model-impl.cpp b/dali-scene3d/internal/controls/model/model-impl.cpp index 8d13ac9..b7cb6ef 100644 --- a/dali-scene3d/internal/controls/model/model-impl.cpp +++ b/dali-scene3d/internal/controls/model/model-impl.cpp @@ -822,12 +822,12 @@ void Model::CreateModel() BoundingVolume AABB; Dali::Scene3D::Loader::Transforms xforms{Dali::Scene3D::Loader::MatrixStack{}, Dali::Scene3D::Loader::ViewProjection{}}; Dali::Scene3D::Loader::NodeDefinition::CreateParams nodeParams{mModelLoadTask->mLoadResult.mResources, xforms, {}, {}, {}}; - uint32_t rootCount = 0u; + + // Generate Dali handles from resource bundle. Note that we generate all scene's resouce immediatly. + mModelLoadTask->mLoadResult.mResources.GenerateResources(mModelLoadTask->mResourceRefCount); for(auto iRoot : mModelLoadTask->mLoadResult.mScene.GetRoots()) { - mModelLoadTask->mLoadResult.mResources.GenerateResources(mModelLoadTask->mResourceRefCounts[rootCount]); - if(auto actor = mModelLoadTask->mLoadResult.mScene.CreateNodes(iRoot, mModelLoadTask->mResourceChoices, nodeParams)) { mModelLoadTask->mLoadResult.mScene.ConfigureSkeletonJoints(iRoot, mModelLoadTask->mLoadResult.mResources.mSkeletons, actor); @@ -840,7 +840,6 @@ void Model::CreateModel() } AddModelTreeToAABB(AABB, mModelLoadTask->mLoadResult.mScene, mModelLoadTask->mResourceChoices, iRoot, nodeParams, Matrix::IDENTITY); - rootCount++; } mNaturalSize = AABB.CalculateSize(); -- 2.7.4