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>
{
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;
}
}
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;
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);
}
AddModelTreeToAABB(AABB, mModelLoadTask->mLoadResult.mScene, mModelLoadTask->mResourceChoices, iRoot, nodeParams, Matrix::IDENTITY);
- rootCount++;
}
mNaturalSize = AABB.CalculateSize();