From 037f2a089e9b9b886da4184bc31f48cc97fa82bf Mon Sep 17 00:00:00 2001 From: "taeyoon0.lee" Date: Wed, 11 Oct 2017 18:06:20 +0900 Subject: [PATCH] Revert "[4.0] Add support for Imagevisual to use External Texture as input through Url" This reverts commit a240967b70f0acbe009318ec98ee9a6c338399f6. Change-Id: Ifa94801d7f90d09d09ba22d43d3909df112c7520 --- .../src/dali-toolkit/utc-Dali-ImageView.cpp | 26 +-- dali-toolkit/devel-api/file.list | 3 +- .../internal/visuals/image/image-visual.cpp | 186 +++++++++++++++------ dali-toolkit/internal/visuals/image/image-visual.h | 18 +- .../internal/visuals/texture-manager-impl.cpp | 134 +-------------- .../internal/visuals/texture-manager-impl.h | 41 ++--- 6 files changed, 178 insertions(+), 230 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index bac289e..31909d9 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -590,6 +589,7 @@ int UtcDaliImageViewSyncLoading(void) END_TEST; } + int UtcDaliImageViewSyncLoading02(void) { ToolkitTestApplication application; @@ -626,30 +626,6 @@ int UtcDaliImageViewSyncLoading02(void) END_TEST; } -int UtcDaliImageViewAddedTexture(void) -{ - ToolkitTestApplication application; - - tet_infoline("ImageView Testing image view with texture provided manager url"); - - ImageView imageView = ImageView::New(); - - // empty texture is ok, though pointless from app point of view - TextureSet empty; - std::string url = TextureManager::AddTexture(empty); - DALI_TEST_CHECK(url.size() > 0u); - - Property::Map propertyMap; - propertyMap[ImageVisual::Property::URL] = url; - imageView.SetProperty(ImageView::Property::IMAGE, propertyMap); - - Stage::GetCurrent().Add( imageView ); - application.SendNotification(); - application.Render(); - - END_TEST; -} - int UtcDaliImageViewSizeWithBackground(void) { ToolkitTestApplication application; diff --git a/dali-toolkit/devel-api/file.list b/dali-toolkit/devel-api/file.list index bf48263..15e0d2f 100644 --- a/dali-toolkit/devel-api/file.list +++ b/dali-toolkit/devel-api/file.list @@ -118,8 +118,7 @@ devel_api_focus_manager_header_files = \ devel_api_image_loader_header_files = \ $(devel_api_src_dir)/image-loader/async-image-loader-devel.h \ $(devel_api_src_dir)/image-loader/atlas-upload-observer.h \ - $(devel_api_src_dir)/image-loader/image-atlas.h \ - $(devel_api_src_dir)/image-loader/texture-manager.h + $(devel_api_src_dir)/image-loader/image-atlas.h devel_api_scripting_header_files = \ $(devel_api_src_dir)/scripting/script.h \ diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 8961b4b..ab956e8 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -269,7 +269,7 @@ ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, mWrapModeU( WrapMode::DEFAULT ), mWrapModeV( WrapMode::DEFAULT ), mAttemptAtlasing( false ), - mLoadingStatus( false ) + mTextureLoading( false ) { } @@ -287,23 +287,12 @@ ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, const Image& image ) mWrapModeU( WrapMode::DEFAULT ), mWrapModeV( WrapMode::DEFAULT ), mAttemptAtlasing( false ), - mLoadingStatus( false ) + mTextureLoading( false ) { } ImageVisual::~ImageVisual() { - if( mMaskingData && Stage::IsInstalled() ) - { - // TextureManager could have been deleted before the actor that contains this - // ImageVisual is destroyed (e.g. due to stage shutdown). Ensure the stage - // is still valid before accessing texture manager. - if( mMaskingData->mAlphaMaskId != TextureManager::INVALID_TEXTURE_ID ) - { - TextureManager& textureManager = mFactoryCache.GetTextureManager(); - textureManager.Remove( mMaskingData->mAlphaMaskId ); - } - } delete mMaskingData; } @@ -369,6 +358,7 @@ void ImageVisual::DoSetProperties( const Property::Map& propertyMap ) } } } + } void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& value ) @@ -476,9 +466,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v { AllocateMaskData(); // Immediately trigger the alpha mask loading (it may just get a cached value) - mMaskingData->mAlphaMaskUrl = alphaUrl; - TextureManager& textureManager = mFactoryCache.GetTextureManager(); - mMaskingData->mAlphaMaskId = textureManager.RequestMaskLoad( alphaUrl ); + mMaskingData->SetImage( alphaUrl ); } break; } @@ -511,7 +499,8 @@ void ImageVisual::AllocateMaskData() { if( mMaskingData == NULL ) { - mMaskingData = new TextureManager::MaskingData(); + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + mMaskingData = new MaskingData(textureManager); } } @@ -686,42 +675,118 @@ bool ImageVisual::IsSynchronousResourceLoading() const return mImpl->mFlags & Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; } -/* -( VisualUrl& url, Dali::ImageDimensions desiredSize, Dali::FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode, - ImageVisual::MaskingData* maskInfo, bool synchronousLoading, - TextureManager::TextureId textureId, Vector4& textureRect, bool& atlasingStatus, bool& loadingStatus - */ +TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, bool synchronousLoading, bool attemptAtlasing ) +{ + TextureSet textureSet; + + mTextureLoading = false; + textureRect = FULL_TEXTURE_RECT; + + if( synchronousLoading ) + { + PixelData data; + if( mImageUrl.IsValid() ) + { + // if sync loading is required, the loading should immediately when actor is on stage + Devel::PixelBuffer pixelBuffer = LoadImageFromFile( mImageUrl.GetUrl(), mDesiredSize, mFittingMode, mSamplingMode ); + + if( pixelBuffer ) + { + data = Devel::PixelBuffer::Convert(pixelBuffer); // takes ownership of buffer + } + } + if( !data ) + { + // use broken image + textureSet = TextureSet::New(); + TextureSetImage( textureSet, 0u, VisualFactoryCache::GetBrokenVisualImage() ); + } + else + { + if( attemptAtlasing ) + { + textureSet = mFactoryCache.GetAtlasManager()->Add( textureRect, data ); + mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + } + if( !textureSet ) // big image, no atlasing or atlasing failed + { + mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; + Texture texture = Texture::New( Dali::TextureType::TEXTURE_2D, data.GetPixelFormat(), + data.GetWidth(), data.GetHeight() ); + texture.Upload( data ); + textureSet = TextureSet::New(); + textureSet.SetTexture( 0u, texture ); + } + } + } + else + { + mTextureLoading = true; + if( attemptAtlasing ) + { + textureSet = mFactoryCache.GetAtlasManager()->Add( textureRect, mImageUrl.GetUrl(), mDesiredSize, mFittingMode, true, this ); + mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + } + if( !textureSet ) // big image, no atlasing or atlasing failed + { + mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + if( mMaskingData == NULL ) + { + mTextureId = textureManager.RequestLoad( mImageUrl, mDesiredSize, mFittingMode, + mSamplingMode, TextureManager::NO_ATLAS, this ); + } + else + { + mTextureId = textureManager.RequestLoad( mImageUrl, + mMaskingData->mAlphaMaskId, + mMaskingData->mContentScaleFactor, + mDesiredSize, + mFittingMode, mSamplingMode, + TextureManager::NO_ATLAS, + mMaskingData->mCropToMask, + this ); + } + + TextureManager::LoadState loadState = textureManager.GetTextureState( mTextureId ); + mTextureLoading = ( loadState == TextureManager::LOADING ); + + if( loadState == TextureManager::UPLOADED ) + { + // UploadComplete has already been called - keep the same texture set + textureSet = textureManager.GetTextureSet(mTextureId); + } + } + } + + if( ! (mImpl->mFlags & Impl::IS_ATLASING_APPLIED) && textureSet ) + { + Sampler sampler = Sampler::New(); + sampler.SetWrapMode( mWrapModeU, mWrapModeV ); + textureSet.SetSampler( 0u, sampler ); + } + + return textureSet; +} + void ImageVisual::InitializeRenderer() { mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; - TextureManager& textureManager = mFactoryCache.GetTextureManager(); - if( ! mImpl->mCustomShader && mImageUrl.GetProtocolType() == VisualUrl::LOCAL ) { bool defaultWrapMode = mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE; Vector4 atlasRect; - - auto attemptAtlasing = mAttemptAtlasing; - // texture set has to be created first as we need to know if atlasing succeeded or not // when selecting the shader - TextureSet textures = - textureManager.LoadTexture(mImageUrl, mDesiredSize, mFittingMode, mSamplingMode, - mMaskingData, IsSynchronousResourceLoading(), mTextureId, - atlasRect, attemptAtlasing, mLoadingStatus, mWrapModeU, - mWrapModeV, this, this, mFactoryCache.GetAtlasManager()); - if(attemptAtlasing) - { - mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; - } + TextureSet textures = CreateTextureSet( atlasRect, IsSynchronousResourceLoading(), mAttemptAtlasing ); CreateRenderer( textures ); if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) // the texture is packed inside atlas { mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect ); - if( !defaultWrapMode ) // custom wrap mode + if( !defaultWrapMode ) // custom wrap mode, renderer is not cached. { Vector2 wrapMode(mWrapModeU-WrapMode::CLAMP_TO_EDGE, mWrapModeV-WrapMode::CLAMP_TO_EDGE); wrapMode.Clamp( Vector2::ZERO, Vector2( 2.f, 2.f ) ); @@ -731,21 +796,16 @@ void ImageVisual::InitializeRenderer() } else { - auto attemptAtlasing = false; // for custom shader or remote image, atlas is not applied Vector4 atlasRect; // ignored in this case - TextureSet textures = - textureManager.LoadTexture(mImageUrl, mDesiredSize, mFittingMode, mSamplingMode, - mMaskingData, IsSynchronousResourceLoading(), mTextureId, - atlasRect, attemptAtlasing, mLoadingStatus, mWrapModeU, mWrapModeV, this, - nullptr, nullptr); // no atlasing - DALI_ASSERT_DEBUG(attemptAtlasing == false); + TextureSet textures = CreateTextureSet( atlasRect, IsSynchronousResourceLoading(), false ); CreateRenderer( textures ); } } void ImageVisual::InitializeRenderer( const Image& image ) { + // don't reuse CreateTextureSet TextureSet textures = TextureSet::New(); NativeImage nativeImage = NativeImage::DownCast( image ); @@ -793,7 +853,7 @@ void ImageVisual::DoSetOnStage( Actor& actor ) mImpl->mRenderer.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, mPixelArea ); } - if( mLoadingStatus == false ) + if( mTextureLoading == false ) { actor.AddRenderer( mImpl->mRenderer ); mPlacementActor.Reset(); @@ -814,7 +874,7 @@ void ImageVisual::DoSetOffStage( Actor& actor ) RemoveTexture( mImageUrl.GetUrl() ); mImage.Reset(); } - mLoadingStatus = false; + mTextureLoading = false; mImpl->mRenderer.Reset(); mPlacementActor.Reset(); } @@ -950,7 +1010,7 @@ void ImageVisual::UploadCompleted() // reset the weak handle so that the renderer only get added to actor once mPlacementActor.Reset(); } - mLoadingStatus = false; + mTextureLoading = false; } // From Texture Manager @@ -985,7 +1045,7 @@ void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, Textur ResourceReady(); } } - mLoadingStatus = false; + mTextureLoading = false; } void ImageVisual::RemoveTexture(const std::string& url) @@ -1015,6 +1075,36 @@ void ImageVisual::RemoveTexture(const std::string& url) } } + +ImageVisual::MaskingData::MaskingData( TextureManager& textureManager ) +: mTextureManager( textureManager ), + mAlphaMaskUrl(), + mAlphaMaskId( TextureManager::INVALID_TEXTURE_ID ), + mContentScaleFactor( 1.0f ), + mCropToMask( true ) +{ +} + +ImageVisual::MaskingData::~MaskingData() +{ + if( Stage::IsInstalled() ) + { + // TextureManager could have been deleted before the actor that contains this + // ImageVisual is destroyed (e.g. due to stage shutdown). Ensure the stage + // is still valid before accessing texture manager. + if( mAlphaMaskId != TextureManager::INVALID_TEXTURE_ID ) + { + mTextureManager.Remove( mAlphaMaskId ); + } + } +} + +void ImageVisual::MaskingData::SetImage( const std::string& maskUrl ) +{ + mAlphaMaskUrl = maskUrl; + mAlphaMaskId = mTextureManager.RequestMaskLoad( mAlphaMaskUrl ); +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/visuals/image/image-visual.h b/dali-toolkit/internal/visuals/image/image-visual.h index bee6067..0c2f756 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.h +++ b/dali-toolkit/internal/visuals/image/image-visual.h @@ -314,12 +314,24 @@ private: void DoSetProperty( Property::Index index, const Property::Value& value ); private: + struct MaskingData + { + MaskingData( TextureManager& textureManager ); + ~MaskingData(); + void SetImage( const std::string& url ); + + TextureManager& mTextureManager; + VisualUrl mAlphaMaskUrl; + TextureManager::TextureId mAlphaMaskId; + float mContentScaleFactor; + bool mCropToMask; + }; Image mImage; Vector4 mPixelArea; WeakHandle mPlacementActor; VisualUrl mImageUrl; - TextureManager::MaskingData* mMaskingData; + MaskingData* mMaskingData; Dali::ImageDimensions mDesiredSize; TextureManager::TextureId mTextureId; @@ -328,8 +340,8 @@ private: Dali::SamplingMode::Type mSamplingMode:4; Dali::WrapMode::Type mWrapModeU:3; Dali::WrapMode::Type mWrapModeV:3; - bool mAttemptAtlasing; ///< If true will attempt atlasing, otherwise create unique texture - bool mLoadingStatus; ///< True if the texture is being loaded asynchronously, or false when it has loaded. + bool mAttemptAtlasing:1; ///< If true will attempt atlasing, otherwise create unique texture + bool mTextureLoading:1; ///< True if the texture is being loaded asynchronously, or false when it has loaded. }; diff --git a/dali-toolkit/internal/visuals/texture-manager-impl.cpp b/dali-toolkit/internal/visuals/texture-manager-impl.cpp index 66f6a81..f074087 100644 --- a/dali-toolkit/internal/visuals/texture-manager-impl.cpp +++ b/dali-toolkit/internal/visuals/texture-manager-impl.cpp @@ -21,9 +21,7 @@ // EXTERNAL HEADERS #include #include -#include #include -#include #include #include #include @@ -32,7 +30,6 @@ // INTERNAL HEADERS #include #include -#include namespace { @@ -87,13 +84,6 @@ const int INVALID_CACHE_INDEX( -1 ); ///< Invalid Cache index } // Anonymous namespace -TextureManager::MaskingData::MaskingData() -: mAlphaMaskUrl(), - mAlphaMaskId( INVALID_TEXTURE_ID ), - mContentScaleFactor( 1.0f ), - mCropToMask( true ) -{ -} TextureManager::TextureManager() : mAsyncLocalLoaders( GetNumberOfLocalLoaderThreads(), [&]() { return AsyncLoadingHelper(*this); } ), @@ -102,125 +92,6 @@ TextureManager::TextureManager() { } -TextureSet TextureManager::LoadTexture( - VisualUrl& url, Dali::ImageDimensions desiredSize, Dali::FittingMode::Type fittingMode, - Dali::SamplingMode::Type samplingMode, const MaskingDataPointer& maskInfo, - bool synchronousLoading, TextureManager::TextureId& textureId, Vector4& textureRect, - bool& atlasingStatus, bool& loadingStatus, Dali::WrapMode::Type wrapModeU, - Dali::WrapMode::Type wrapModeV, TextureUploadObserver* textureObserver, - AtlasUploadObserver* atlasObserver, ImageAtlasManagerPtr imageAtlasManager) -{ - TextureSet textureSet; - - loadingStatus = false; - textureRect = FULL_ATLAS_RECT; - - if( VisualUrl::TEXTURE == url.GetProtocolType()) - { - std::string location = url.GetLocation(); - if( location.size() > 0u ) - { - TextureId id = std::stoi( location ); - for( auto&& elem : mExternalTextures ) - { - if( elem.textureId == id ) - { - return elem.textureSet; - } - } - } - } - else if( synchronousLoading ) - { - PixelData data; - if( url.IsValid() ) - { - // if sync loading is required, the loading should immediately when actor is on stage - Devel::PixelBuffer pixelBuffer = LoadImageFromFile( url.GetUrl(), desiredSize, fittingMode, samplingMode ); - if( pixelBuffer ) - { - data = Devel::PixelBuffer::Convert(pixelBuffer); // takes ownership of buffer - } - } - if( !data ) - { - // use broken image - textureSet = TextureSet::New(); - Devel::PixelBuffer pixelBuffer = LoadImageFromFile( BROKEN_IMAGE_URL ); - if( pixelBuffer ) - { - data = Devel::PixelBuffer::Convert(pixelBuffer); // takes ownership of buffer - } - Texture texture = Texture::New( Dali::TextureType::TEXTURE_2D, data.GetPixelFormat(), - data.GetWidth(), data.GetHeight() ); - texture.Upload( data ); - textureSet = TextureSet::New(); - textureSet.SetTexture( 0u, texture ); - } - else - { - if( atlasingStatus ) // attempt atlasing - { - textureSet = imageAtlasManager->Add( textureRect, data ); - } - if( !textureSet ) // big image, no atlasing or atlasing failed - { - atlasingStatus = false; - Texture texture = Texture::New( Dali::TextureType::TEXTURE_2D, data.GetPixelFormat(), - data.GetWidth(), data.GetHeight() ); - texture.Upload( data ); - textureSet = TextureSet::New(); - textureSet.SetTexture( 0u, texture ); - } - } - } - else - { - loadingStatus = true; - if( atlasingStatus ) - { - textureSet = imageAtlasManager->Add( textureRect, url.GetUrl(), desiredSize, fittingMode, true, atlasObserver ); - } - if( !textureSet ) // big image, no atlasing or atlasing failed - { - atlasingStatus = false; - if( !maskInfo ) - { - textureId = RequestLoad( url, desiredSize, fittingMode, samplingMode, TextureManager::NO_ATLAS, textureObserver ); - } - else - { - textureId = RequestLoad( url, - maskInfo->mAlphaMaskId, - maskInfo->mContentScaleFactor, - desiredSize, - fittingMode, samplingMode, - TextureManager::NO_ATLAS, - maskInfo->mCropToMask, - textureObserver ); - } - - TextureManager::LoadState loadState = GetTextureState( textureId ); - loadingStatus = ( loadState == TextureManager::LOADING ); - - if( loadState == TextureManager::UPLOADED ) - { - // UploadComplete has already been called - keep the same texture set - textureSet = GetTextureSet( textureId ); - } - } - } - - if( ! atlasingStatus && textureSet ) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode( wrapModeU, wrapModeV ); - textureSet.SetSampler( 0u, sampler ); - } - - return textureSet; -} - TextureManager::TextureId TextureManager::RequestLoad( const VisualUrl& url, const ImageDimensions desiredSize, @@ -252,6 +123,7 @@ TextureManager::TextureId TextureManager::RequestMaskLoad( const VisualUrl& mask return RequestLoadInternal( maskUrl, INVALID_TEXTURE_ID, 1.0f, ImageDimensions(), FittingMode::SCALE_TO_FILL, SamplingMode::NO_FILTER, NO_ATLAS, false, KEEP_PIXEL_BUFFER, NULL ); } + TextureManager::TextureId TextureManager::RequestLoadInternal( const VisualUrl& url, TextureId maskTextureId, @@ -843,6 +715,10 @@ void TextureManager::ObserverDestroyed( TextureUploadObserver* observer ) } } +TextureManager::~TextureManager() +{ +} + TextureManager::AsyncLoadingHelper::AsyncLoadingHelper(TextureManager& textureManager) : AsyncLoadingHelper(Toolkit::AsyncImageLoader::New(), textureManager, AsyncLoadingInfoContainerType()) diff --git a/dali-toolkit/internal/visuals/texture-manager-impl.h b/dali-toolkit/internal/visuals/texture-manager-impl.h index 868afdc..117bd1f 100644 --- a/dali-toolkit/internal/visuals/texture-manager-impl.h +++ b/dali-toolkit/internal/visuals/texture-manager-impl.h @@ -45,8 +45,6 @@ namespace Toolkit namespace Internal { -class ImageAtlasManager; -typedef IntrusivePtr ImageAtlasManagerPtr; /** * The TextureManager provides a common Image loading API for Visuals. @@ -105,17 +103,6 @@ public: public: - struct MaskingData - { - MaskingData(); - ~MaskingData() = default; - - VisualUrl mAlphaMaskUrl; - TextureManager::TextureId mAlphaMaskId; - float mContentScaleFactor; - bool mCropToMask; - }; - /** * Constructor. */ @@ -124,20 +111,11 @@ public: /** * Destructor. */ - ~TextureManager() = default; + ~TextureManager(); // TextureManager Main API: - TextureSet LoadTexture(VisualUrl& url, Dali::ImageDimensions desiredSize, - Dali::FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode, - MaskingData* maskInfo, bool synchronousLoading, - TextureManager::TextureId& textureId, Vector4& textureRect, - bool& atlasingStatus, bool& loadingStatus, Dali::WrapMode::Type wrapModeU, - Dali::WrapMode::Type wrapModeV, TextureUploadObserver* textureObserver, - AtlasUploadObserver* atlasObserver, - ImageAtlasManagerPtr imageAtlasManager); - /** * @brief Requests an image load of the given URL. * @@ -367,9 +345,25 @@ private: unsigned short loadId; ///< The load Id used by the async loader to reference this load }; + /** + * @brief This struct is used within a container to manage atlas creation and destruction. + */ + struct AtlasInfo + { + AtlasInfo( Toolkit::ImageAtlas atlas, TextureSet textureSet ) + : atlas( atlas ), + textureSet( textureSet ) + { + } + + Toolkit::ImageAtlas atlas; ///< The ImageAtlas object + TextureSet textureSet; ///< The TextureSet is kept in the struct to allow fast lookup of TextureSet to Atlas + }; + // Private typedefs: typedef std::deque AsyncLoadingInfoContainerType; ///< The container type used to manage Asynchronous loads in progress + typedef std::vector AtlasInfoContainerType; ///< The container type used to manage Atlas creation and destruction typedef std::vector TextureInfoContainerType; ///< The container type used to manage the life-cycle and caching of Textures /** @@ -592,6 +586,7 @@ private: private: // Member Variables: + AtlasInfoContainerType mAtlasContainer; ///< Used to manage Atlas creation and destruction TextureInfoContainerType mTextureInfoContainer; ///< Used to manage the life-cycle and caching of Textures RoundRobinContainerView< AsyncLoadingHelper > mAsyncLocalLoaders; ///< The Asynchronous image loaders used to provide all local async loads RoundRobinContainerView< AsyncLoadingHelper > mAsyncRemoteLoaders; ///< The Asynchronous image loaders used to provide all remote async loads -- 2.7.4