/*---------------------------------------------------------------------------* Project: NintendoWare File: SmParticle.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: $ *---------------------------------------------------------------------------*/ #ifndef SM_PARTICLE_H_ #define SM_PARTICLE_H_ #include #include "../include/SmBase.h" //------------------------------------------------------------------------------ // NW4C パーティクル各機能へのアクセサクラス class SmParticle : public SmBase { friend class GfxCtrl; #define ARRAY_COUNT (32) //! 生成されたParticleModelインスタンスを保持するための配列です。 typedef nw::ut::FixedSizeArray ParticleModelInstanceArray; //! 生成されたParticleEmitterインスタンスを保持するための配列です。 typedef nw::ut::FixedSizeArray ParticleEmitterInstanceArray; //! typedef nw::ut::FixedSizeArray ParticleInstAttachedArray; private: // コンストラクタ SmParticle( nw::gfx::SceneNode* parentNode ); // デストラクタ ~SmParticle(); public: // パーティクルモデルを追加 void AddParticleModel( nw::gfx::ParticleModel* particleModel ); // パーティクルエミッタを追加 void AddParticleEmitter( nw::gfx::ParticleEmitter* particleEmitter ); // アニメーションフレームを設定する void SetAnimationFrame( f32 setFrame ); // アニメーションフレームを進める bool AddAnimationFrame( f32 addFrame, bool loop = true ); // リセットする void Reset(); // 表示/非表示 void SetVisible( bool visible ) { /* 現状、パーティクルモデル・エミッタが同数の場合のみ動作する。 */ if( m_ParticleModelInstArray.size() != m_ParticleEmitterInstArray.size() ) { return; } for ( int i=0; iSetLayerId( id ); } } /* エミッタ操作 */ nw::gfx::ParticleEmitter* GetEmitter( uint idx = 0 ) { return m_ParticleEmitterInstArray[idx]; } void ResetEmitter( int idx = -1 ) { if ( idx == -1 ) { for ( int i=0; iReset(); } } else { if ( idx < m_ParticleEmitterInstArray.size() ) { m_ParticleEmitterInstArray[idx]->Reset(); } } } // void SetVisibleZone( f32 term ); private: void detach( int index ) { if ( m_ParticleModelInstArray[index]->GetParent() ) { m_pParentNode->DetachChild( m_ParticleModelInstArray[index] ); } if ( m_ParticleEmitterInstArray[index]->GetParent() ) { m_pParentNode->DetachChild( m_ParticleEmitterInstArray[index] ); } } void attach( int index ) { if ( !m_ParticleModelInstArray[index]->GetParent() ) { m_pParentNode->AttachChild( m_ParticleModelInstArray[index] ); } if ( !m_ParticleEmitterInstArray[index]->GetParent() ) { m_pParentNode->AttachChild( m_ParticleEmitterInstArray[index] ); } } private: nw::gfx::SceneNode* m_pParentNode; ParticleModelInstanceArray m_ParticleModelInstArray; ParticleEmitterInstanceArray m_ParticleEmitterInstArray; bool m_ParticleInstAttachedArray[ARRAY_COUNT]; f32 m_AnimationFrame; }; #endif // SM_PARTICLE_H_