/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_SharedAnimCache.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_SHAREDANIMCACHE_H_ #define NW_GFX_SHAREDANIMCACHE_H_ #include namespace nw { namespace gfx { //--------------------------------------------------------------------------- //! @brief 共有可能なアニメーションキャッシュのクラスです。 //! //! 複数の AnimEvaluator で共有することができるキャッシュクラスです。 //! アニメーション結果を共有する場合、キャッシュ結果を流用することで高速化が期待できます。 //! //! @sa nw::gfx::AnimEvaluator::SetSharedCacheBuffer //--------------------------------------------------------------------------- class SharedAnimCache : public GfxObject { public: //! @brief 共有アニメキャッシュの生成用クラスです。 class Builder { public: //! @brief コンストラクタです。 Builder() : m_AnimDataPtr(NULL), m_CacheBufferSize(0) { } //! @brief 対象のアニメーションを設定します。 Builder& AnimData(anim::ResAnim animData) { m_AnimDataPtr = animData.ptr(); return *this; } //! @brief 確保するキャッシュのサイズを設定します。 //! //! nw::gfx::AnimEvaluator::GetCacheBufferSizeNeeded() を利用して、必要なサイズが求められます。 Builder& CacheBufferSize(int size) { m_CacheBufferSize = size; return *this; } //! @brief 共有可能なアニメーションキャッシュを生成します。 //! //! @param[in] allocator アロケータです。 //! //! @return 生成したアニメーションキャッシュです。 //! SharedAnimCache* Create(os::IAllocator* allocator) { void* memory = allocator->Alloc(sizeof(SharedAnimCache)); if (memory == NULL) { return NULL; } SharedAnimCache* result = new(memory) SharedAnimCache(allocator); result->SetAnimData(m_AnimDataPtr); bool cacheBufferAlloced = result->AllocBuffer(m_CacheBufferSize); if (!cacheBufferAlloced) { result->~SharedAnimCache(); allocator->Free(result); return NULL; } return result; } private: anim::ResAnimData* m_AnimDataPtr; int m_CacheBufferSize; }; //! @brief デストラクタです。 //! virtual ~SharedAnimCache() { DestroyCache(); } // キャッシュ更新のために必要なインターフェースです。 // ユーザーが直接操作することは想定されていません。 void SetFrame(f32 frame) { m_Frame = frame; } //!< @details :private f32 GetFrame() const { return m_Frame; } //!< @details :private void SetStepFrame(f32 stepFrame) { m_StepFrame = stepFrame; } //!< @details :private f32 GetStepFrame() const { return m_StepFrame; } //!< @details :private // キャッシュには書き込まないといけないのでconstではない void* GetCacheBuffer() { return m_CacheBuf; } //!< @details :private bool IsDirty() const { return m_IsDirty; } //!< @details :private void SetDirtyFlag(bool isDirty) { m_IsDirty = isDirty; } //!< @details :private private: void SetAnimData(const anim::ResAnimData* animData) { m_AnimData = anim::ResAnim(animData); } bool AllocBuffer(int cacheBufferSize) { // バッファの確保ができなかった場合はfalseを返し、生成の成否を判断する if (0 < cacheBufferSize) { NW_ASSERT(m_CacheBuf == NULL); m_CacheBuf = GetAllocator().Alloc(cacheBufferSize); return (m_CacheBuf != NULL); } return false; } explicit SharedAnimCache(os::IAllocator* allocator) : GfxObject(allocator), m_CacheBuf(NULL), m_AnimData(NULL), m_Frame(0.0f), m_StepFrame(0.0f), m_IsDirty(true) { } NW_INLINE void DestroyCache() { if (m_CacheBuf != NULL) { os::SafeFree(m_CacheBuf, &GetAllocator()); } } void* m_CacheBuf; // キャッシュのインデックスはAnimEvaluatorのCachePtrを使うので持たない。 // このクラスが持つのは、フレーム、データのポインタなど、アニメの状態を一意に決定する情報。 anim::ResAnim m_AnimData; f32 m_Frame; f32 m_StepFrame; bool m_IsDirty; }; } // namespace gfx } // namespace nw #endif // NW_GFX_SHAREDANIMCACHE_H_