1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Picture.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_LYT_PICTURE_H_
19 #define NW_LYT_PICTURE_H_
20 
21 #include <nw/ut/ut_Color.h>
22 #include <nw/ut/ut_RuntimeTypeInfo.h>
23 
24 #include <nw/lyt/lyt_Config.h>
25 #include <nw/lyt/lyt_Material.h>
26 #include <nw/lyt/lyt_Pane.h>
27 
28 namespace nw
29 {
30 namespace lyt
31 {
32 
33 class DrawInfo;
34 
35 //---------------------------------------------------------------------------
36 //! :category 描画
37 //!
38 //! @brief 画像の表示を行うペインです。
39 //!
40 //! @since 2009/09/18 初版。
41 //---------------------------------------------------------------------------
42 class Picture : public Pane
43 {
44     typedef Pane Base;
45 
46 public:
47     //! 実行時型情報です。
48     NW_UT_RUNTIME_TYPEINFO;
49 
50     //----------------------------------------
51     //! @name コンストラクタ/デストラクタ
52     //@{
53 
54     //! @brief コンストラクタです。
55     //!
56     //! @details
57     //! 指定したテクスチャの枚数分のメモリを確保して、オブジェクトを生成します。
58     //!
59     //! @param texNum 使用するテクスチャの最大数です。
60     //!
61     //! @since 2009/09/18 初版。
62     //!
63     explicit Picture(u8 texNum);
64 
65     //! @brief コンストラクタです。
66     //!
67     //! @details
68     //! 指定したテクスチャを使用するオブジェクトを生成します。
69     //! 保持できるテクスチャ座標の数は 1 に設定されます。
70     //!
71     //! @param texMap TexMap への参照です。
72     //!
73     //! @since 2009/09/18 初版。
74     //!
75     explicit Picture(const TexMap& texMap);
76 
77     //! @brief コンストラクタです。
78     //!
79     //! @details
80     //! 指定したリソースからオブジェクトを生成します。
81     //!
82     //! @param pBlock リソースへのポインタです。
83     //! @param resBlockSet ResBlockSet への参照です。
84     //!
85     //! @since 2009/09/18 初版。
86     //!
87     Picture(
88         const res::Picture* pBlock,
89         const ResBlockSet& resBlockSet);
90 
91     //! @brief デストラクタです。
92     //!
93     //! @since 2009/09/18 初版。
94     //!
95     virtual ~Picture();
96 
97     //@}
98 
99     //----------------------------------------
100     //! @name 設定/取得
101     //@{
102 
103     //! @brief テクスチャを追加します。
104     //!
105     //! @param texMap TexMap への参照です。
106     //!
107     //! @since 2009/09/18 初版。
108     //!
109     virtual void Append(const TexMap& texMap);
110 
111     //! @brief 頂点カラーを取得します。
112     //!
113     //! @details
114     //! idx で指定した頂点カラーを取得します。
115     //!
116     //! @param idx インデックスです。 lyt::VertexColor を指定します。
117     //!
118     //! @return カラーを返します。
119     //!
120     //! @sa SetVtxColor
121     //! @sa GetVtxColorElement
122     //! @sa lyt::VertexColor
123     //!
124     //! @since 2009/09/18 初版。
125     //!
126     virtual const ut::Color8 GetVtxColor(u32 idx) const;
127 
128     //! @brief 頂点カラーを設定します。
129     //!
130     //! @param idx インデックスです。 lyt::VertexColor を指定します。
131     //! @param value 頂点カラーです。
132     //!
133     //! @sa GetVtxColor
134     //! @sa SetVtxColorElement
135     //! @sa lyt::VertexColor
136     //!
137     //! @since 2009/09/18 初版。
138     //!
139     virtual void SetVtxColor(u32 idx, ut::Color8 value);
140 
141     //! @brief 頂点カラーの成分を取得します。
142     //!
143     //! @details
144     //! idx で指定した頂点カラーの成分を取得します。
145     //!
146     //! idx の指定には lyt::ANIMTARGET_VERTEXCOLOR_* を使用してください。
147     //!
148     //! @param idx インデックスです。
149     //!
150     //! @return 頂点カラーの成分を返します。 lyt::AnimTargetPaneColor を指定します。
151     //!
152     //! @sa SetVtxColorElement
153     //! @sa GetVtxColor
154     //! @sa lyt::AnimTargetPaneColor
155     //!
156     //! @since 2009/09/18 初版。
157     //!
158     virtual u8 GetVtxColorElement(u32 idx) const;
159 
160     //! @brief 頂点カラーの成分を設定します。
161     //!
162     //! idx の指定には lyt::ANIMTARGET_VERTEXCOLOR_* を使用してください。
163     //!
164     //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。
165     //! @param value カラーの成分値です。
166     //!
167     //! @sa GetVtxColorElement
168     //! @sa SetVtxColor
169     //! @sa lyt::AnimTargetPaneColor
170     //!
171     //! @since 2009/09/18 初版。
172     //!
173     virtual void SetVtxColorElement(u32 idx, u8 value);
174 
175     //! @brief テクスチャ座標を保持するためのメモリ領域を確保します。
176     //!
177     //! @details
178     //! 保持可能なテクスチャ座標の数の初期値はコンストラクタによって異なります。
179     //!
180     //! @param num テクスチャ座標の保持数です。
181     //!
182     //! @sa Picture::Picture
183     //!
184     //! @since 2009/09/18 初版。
185     //!
186     void ReserveTexCoord(u8 num);
187 
188     //! @brief テクスチャ座標の保持数を取得します。
189     //!
190     //! @return 保持しているテクスチャ座標の数を返します。
191     //!
192     //! @sa SetTexCoordNum
193     //!
194     //! @since 2009/09/18 初版。
195     //!
196     u8 GetTexCoordNum() const;
197 
198     //! @brief テクスチャ座標の保持数を設定します。
199     //!
200     //! @details
201     //! num に指定できる値は保持可能なテクスチャ座標数以下でなければなりません。
202     //!
203     //! @param num テクスチャ座標の保持数です。
204     //!
205     //! @sa GetTexCoordNum
206     //! @sa ReserveTexCoord
207     //! @sa Picture::Picture
208     //! @sa GetTexCoord
209     //!
210     //! @since 2009/09/18 初版。
211     //!
212     void SetTexCoordNum(u8 num);
213 
214     //! @brief テクスチャ座標を取得します。
215     //!
216     //! @param idx インデックスです。
217     //! @param[out] coords テクスチャ座標を格納する領域へのポインタです。
218     //!
219     //! @sa SetTexCoord
220     //!
221     //! @since 2009/09/18 初版。
222     //!
223     void GetTexCoord(u32 idx, TexCoordQuad coords) const;
224 
225     //! @brief テクスチャ座標を設定します。
226     //!
227     //! @param idx インデックスです。
228     //! @param coords テクスチャ座標です。
229     //!
230     //! @sa GetTexCoord
231     //!
232     //! @since 2009/09/18 初版。
233     //!
234     void SetTexCoord(u32 idx, const TexCoordQuad coords);
235 
236     using Base::GetMaterial;
237 
238     //! @brief ペインが持つマテリアルの数を取得します。
239     //!
240     //! @return マテリアルを持っていれば 1 を返します。
241     //!
242     //! @since 2009/09/18 初版。
243     //!
244     virtual u8 GetMaterialNum() const;
245 
246     //! @brief ペインのマテリアルを取得します。
247     //!
248     //! @details
249     //! idx には 0 のみ指定できます。
250     //!
251     //! @param idx インデックスです。
252     //!
253     //! @return マテリアルへのポインタを返します。
254     //!
255     //! @sa SetMaterial
256     //!
257     //! @since 2009/09/18 初版。
258     //!
259     virtual Material* GetMaterial(u32 idx) const;
260 
261     //! @brief マテリアルを設定します。
262     //!
263     //! @details
264     //! 現在設定されているマテリアルが Picture オブジェクトの生成時に
265     //! 同時に生成されたものだった場合には、そのマテリアルは破棄されます。
266     //!
267     //! @param pMaterial マテリアルへのポインタです。
268     //!
269     //! @since 2009/09/18 初版。
270     //!
271     void SetMaterial(Material* pMaterial);
272 
273     //@}
274 
275 #ifdef NW_LYT_DRAWER_ENABLE
276 public:
277 
278     // 仮実装はlyt_Drawer.cppに書いてます
279     virtual void MakeUniformDataSelf( DrawInfo* pDrawInfo, Drawer* pDrawer ) const;
280 
281 protected: // 処理削減のためにDrawer が使う
282 
283     //! @details :private
284     //! テクスチャ座標が初期化済みかどうか
285     mutable bool m_IsTexCoordInited;
286 
287     //! @details :private
288     //! テクスチャ座標の数のキャッシュ
289     mutable u32 m_UniformTexCoordNum;
290 
291     //! @details :private
292     //! テクスチャ座標のキャッシュ
293     mutable nw::math::VEC4 m_UniformTexCoords[ TexMapMax * 2 ];
294 
295 #endif
296 
297 protected:
298 #ifdef NW_LYT_DMPGL_ENABLED
299     virtual void DrawSelf(const DrawInfo& drawInfo);
300 #endif
301 
302     //! @details :private
303     void Init(u8 texNum);
304 
305 protected:
306     //! @details :private
307     Material* m_pMaterial;
308 
309     //! @details :private
310     ut::Color8 m_VtxColors[VERTEXCOLOR_MAX];
311 
312     //! @details :private
313     internal::TexCoordAry m_TexCoordAry;
314 
315 private:
316     // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。
317     Picture(const Picture& other);
318     Picture& operator = (const Picture& other);
319 };
320 
321 } // namespace nw::lyt
322 } // namespace nw
323 
324 #endif // NW_LYT_PICTURE_H_
325 
326