1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     anim_AnimResult.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NW_ANIM_ANIMRESULT_H_
19 #define NW_ANIM_ANIMRESULT_H_
20 
21 #include <nw/types.h>
22 #include <nw/ut/ut_Flag.h>
23 #include <nw/gfx/gfx_CalculatedTransform.h>
24 
25 namespace nw {
26 namespace anim {
27 
28 //---------------------------------------------------------------------------
29 //! @brief アニメーション結果のクラスです。
30 //---------------------------------------------------------------------------
31 class AnimResult
32 {
33 public:
34     //! フラグの定義です。
35     enum Flags
36     {
37         FLAG_VALID_COMPONENT0_SHIFT = 0, //!< @details :private
38         FLAG_VALID_COMPONENT1_SHIFT = 1, //!< @details :private
39         FLAG_VALID_COMPONENT2_SHIFT = 2, //!< @details :private
40         FLAG_VALID_COMPONENT3_SHIFT = 3, //!< @details :private
41         FLAG_CONVERTED_SHIFT = 30, //!< @details :private
42 
43         //! 0 番目の成分のアニメーションが有効なら 1 となります。
44         FLAG_VALID_COMPONENT0 = 0x1 << FLAG_VALID_COMPONENT0_SHIFT,
45 
46         //! 1 番目の成分のアニメーションが有効なら 1 となります。
47         FLAG_VALID_COMPONENT1 = 0x1 << FLAG_VALID_COMPONENT1_SHIFT,
48 
49         //! 2 番目の成分のアニメーションが有効なら 1 となります。
50         FLAG_VALID_COMPONENT2 = 0x1 << FLAG_VALID_COMPONENT2_SHIFT,
51 
52         //! 3 番目の成分のアニメーションが有効なら 1 となります。
53         FLAG_VALID_COMPONENT3 = 0x1 << FLAG_VALID_COMPONENT3_SHIFT,
54 
55         //! 操作空間に変換されていれば 1 となります。
56         FLAG_CONVERTED = 0x1 << FLAG_CONVERTED_SHIFT
57     };
58 
59     //! 最大成分数です。
60     enum { MAX_COMPONENTS = 4 };
61 
62     //----------------------------------------
63     //! @name コンストラクタ/デストラクタ
64     //@{
65 
66     //! コンストラクタです。
AnimResult()67     AnimResult()
68     : m_Flags(0) {}
69 
70     //! デストラクタです。
~AnimResult()71     virtual ~AnimResult() {}
72 
73     //@}
74 
75     //----------------------------------------
76     //! @name 取得/設定
77     //@{
78 
79     //! フラグの値を直接取得します。
GetFlags()80     bit32 GetFlags() const { return m_Flags; }
81 
82     //! フラグの値を直接設定します。
SetFlags(bit32 flags)83     void SetFlags(bit32 flags) { m_Flags = flags; }
84 
85     //! フラグが有効になっているか取得します。
IsEnabledFlags(bit32 flags)86     bool IsEnabledFlags(bit32 flags) const { return ut::CheckFlag(m_Flags, flags); }
87 
88     //! フラグを有効に設定します。
EnableFlags(bit32 flags)89     void EnableFlags(bit32 flags) { m_Flags = ut::EnableFlag(m_Flags, flags); }
90 
91     //! フラグを無効に設定します。
DisableFlags(bit32 flags)92     void DisableFlags(bit32 flags) { m_Flags = ut::DisableFlag(m_Flags, flags); }
93 
94     //! フラグの有効/無効を設定します。
EnableFlags(bit32 flags,bool enable)95     void EnableFlags(bit32 flags, bool enable)
96     {
97         if (enable)
98         {
99             m_Flags |= flags;
100         }
101         else
102         {
103             m_Flags &= ~flags;
104         }
105     }
106 
107     //! 全てのフラグを無効に設定します。
ResetFlags()108     void ResetFlags() { m_Flags = 0; }
109 
110     //! 値バッファを取得します。
GetValueBuffer()111     const void* GetValueBuffer() const { return m_ValueBuf; }
112 
113     //! 値バッファを取得します。
GetValueBuffer()114     void* GetValueBuffer() { return m_ValueBuf; }
115 
116     //! オブジェクトの先頭から値バッファまでのオフセットをバイト数で取得します。
GetOffsetToValueBuffer()117     int GetOffsetToValueBuffer() const
118     {
119         return reinterpret_cast<const u8*>(GetValueBuffer()) -
120             reinterpret_cast<const u8*>(this);
121     }
122 
123     //@}
124 
125 private:
126     bit32 m_Flags;
127 
128     // ResMemberAnim::GetPrimitiveSize() の最大値以上のサイズの領域
129     float m_ValueBuf[(sizeof(gfx::CalculatedTransform) + sizeof(float) - 1) / sizeof(float)];
130 };
131 
132 } /* namespace anim */
133 } /* namespace nw */
134 
135 #endif /* NW_ANIM_ANIMRESULT_H_ */
136