Make multiple roots model share the resources. 01/289101/2
authorEunki Hong <eunkiki.hong@samsung.com>
Wed, 1 Mar 2023 10:22:55 +0000 (19:22 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 2 Mar 2023 03:32:59 +0000 (12:32 +0900)
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 <eunkiki.hong@samsung.com>
dali-scene3d/internal/common/model-load-task.cpp
dali-scene3d/internal/common/model-load-task.h
dali-scene3d/internal/controls/model/model-impl.cpp

index 4ee2864..aaec429 100644 (file)
@@ -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;
     }
   }
 
index 89d8ad0..bfafeb0 100644 (file)
@@ -83,9 +83,9 @@ public:
   std::string mModelUrl;
   std::string mResourceDirectoryUrl;
 
-  Dali::Scene3D::Loader::Customization::Choices         mResourceChoices;
-  std::vector<Dali::Scene3D::Loader::ResourceRefCounts> mResourceRefCounts;
-  bool                                                  mHasSucceeded;
+  Dali::Scene3D::Loader::Customization::Choices mResourceChoices;
+  Dali::Scene3D::Loader::ResourceRefCounts      mResourceRefCount;
+  bool                                          mHasSucceeded;
 
   ModelCacheManager                 mModelCacheManager;
   Dali::Scene3D::Loader::LoadResult mLoadResult;
index 8d13ac9..b7cb6ef 100644 (file)
@@ -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();