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