1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Window.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: 25594 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_LYT_WINDOW_H_
17 #define NW_LYT_WINDOW_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_Pane.h>
24 
25 namespace nw
26 {
27 namespace lyt
28 {
29 
30 class DrawInfo;
31 class AnimationLink;
32 
33 //---------------------------------------------------------------------------
34 //! :category 描画
35 //!
36 //! @brief ウィンドウの表示を行うペインです。
37 //!
38 //! @since 2009/09/18 初版。
39 //---------------------------------------------------------------------------
40 class Window : public Pane
41 {
42     typedef Pane Base;
43 
44     //! @details :private
45     struct Content
46     {
47         ut::Color8 vtxColors[VERTEXCOLOR_MAX];
48         internal::TexCoordAry texCoordAry;
49     };
50 
51     //! @details :private
52     struct Frame
53     {
FrameFrame54         Frame()
55         :   textureFlip(0),
56             pMaterial(0)
57         {}
58 
59         ~Frame();
60 
GetTextureFlipFrame61         TextureFlip GetTextureFlip() const
62         {
63             return (TextureFlip) this->textureFlip;
64         }
65 
66         u8 textureFlip;
67         Material* pMaterial;
68     };
69 
70 public:
71     //! 実行時型情報です。
72     NW_UT_RUNTIME_TYPEINFO;
73 
74     //----------------------------------------
75     //! @name コンストラクタ/デストラクタ
76     //@{
77 
78     //! @brief コンストラクタです。
79     //!
80     //! @details
81     //! コンテンツ領域とフレーム(4辺共通)でそれぞれ指定したテクスチャの
82     //! 枚数分のメモリを確保して、オブジェクトを生成します。
83     //!
84     //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。
85     //! @param frameTexNum フレームで使用するテクスチャの最大数です。
86     //!
87     //! @since 2009/09/18 初版。
88     //!
89     Window(
90         u8  contentTexNum,
91         u8  frameTexNum);
92 
93     //! @brief コンストラクタです。
94     //!
95     //! @details
96     //! コンテンツ領域とフレーム(4辺)でそれぞれ指定したテクスチャの
97     //! 枚数分のメモリを確保して、オブジェクトを生成します。
98     //!
99     //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。
100     //! @param frameLTTexNum 左上辺フレームで使用するテクスチャの最大数です。
101     //! @param frameRTTexNum 右上辺フレームで使用するテクスチャの最大数です。
102     //! @param frameRBTexNum 右下辺フレームで使用するテクスチャの最大数です。
103     //! @param frameLBTexNum 左下辺フレームで使用するテクスチャの最大数です。
104     //!
105     //! @since 2009/09/18 初版。
106     //!
107     Window(
108         u8  contentTexNum,
109         u8  frameLTTexNum,
110         u8  frameRTTexNum,
111         u8  frameRBTexNum,
112         u8  frameLBTexNum);
113 
114     //! @brief コンストラクタです。
115     //!
116     //! @details
117     //! コンテンツ領域とフレーム(4隅と4辺)でそれぞれ指定したテクスチャの
118     //! 枚数分のメモリを確保して、オブジェクトを生成します。
119     //!
120     //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。
121     //! @param cornerLTTexNum 左上隅フレームで使用するテクスチャの最大数です。
122     //! @param cornerRTTexNum 右上隅フレームで使用するテクスチャの最大数です。
123     //! @param cornerRBTexNum 右下隅フレームで使用するテクスチャの最大数です。
124     //! @param cornerLBTexNum 左下隅フレームで使用するテクスチャの最大数です。
125     //! @param frameLTexNum 左辺フレームで使用するテクスチャの最大数です。
126     //! @param frameTTexNum 上辺フレームで使用するテクスチャの最大数です。
127     //! @param frameRTexNum 右辺フレームで使用するテクスチャの最大数です。
128     //! @param frameBTexNum 下辺フレームで使用するテクスチャの最大数です。
129     //!
130     //! @since 2009/09/18 初版。
131     //!
132     Window(
133         u8  contentTexNum,
134         u8  cornerLTTexNum,
135         u8  cornerRTTexNum,
136         u8  cornerRBTexNum,
137         u8  cornerLBTexNum,
138         u8  frameLTexNum,
139         u8  frameTTexNum,
140         u8  frameRTexNum,
141         u8  frameBTexNum);
142 
143     //! @brief コンストラクタです。
144     //!
145     //! @details
146     //! リソースからオブジェクトを生成します。
147     //!
148     //! @param pBlock リソースへのポインタです。
149     //! @param resBlockSet ResBlockSet への参照です。
150     //!
151     //! @since 2009/09/18 初版。
152     //!
153     Window(
154         const res::Window*  pBlock,
155         const ResBlockSet&  resBlockSet);
156 
157     //! @brief デストラクタです。
158     //!
159     //! @since 2009/09/18 初版。
160     //!
161     virtual ~Window();
162 
163     //@}
164 
165     //----------------------------------------
166     //! @name 設定/取得
167     //@{
168 
169     //! @brief 頂点カラーを取得します。
170     //!
171     //! @param idx インデックスです。 lyt::VertexColor を指定します。
172     //!
173     //! @return ペインの四隅の頂点カラーを返します。
174     //!
175     //! @sa SetVtxColor
176     //! @sa GetVtxColorElement
177     //! @sa lyt::VertexColor
178     //!
179     //! @since 2009/09/18 初版。
180     //!
181     virtual const ut::Color8 GetVtxColor(u32 idx) const;
182 
183     //! @brief 頂点カラーを設定します。
184     //!
185     //! @param idx インデックスです。 lyt::VertexColor を指定します。
186     //! @param value 頂点カラーです。
187     //!
188     //! @sa GetVtxColor
189     //! @sa SetVtxColorElement
190     //! @sa lyt::VertexColor
191     //!
192     //! @since 2009/09/18 初版。
193     //!
194     virtual void SetVtxColor(u32 idx, ut::Color8 value);
195 
196     //! @brief テキストの表示色(頂点カラー)の各カラー成分を取得します。
197     //!
198     //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。
199     //!
200     //! @return テキストの表示色の各成分を返します。
201     //!
202     //! @sa SetVtxColorElement
203     //! @sa GetVtxColor
204     //! @sa lyt::AnimTargetPaneColor
205     //!
206     //! @since 2009/09/18 初版。
207     //!
208     virtual u8 GetVtxColorElement(u32 idx) const;
209 
210     //! @brief テキストの表示色(頂点カラー)の各カラー成分を設定します。
211     //!
212     //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。
213     //! @param value カラーの成分値です。
214     //!
215     //! @sa GetVtxColorElement
216     //! @sa SetVtxColor
217     //! @sa lyt::AnimTargetPaneColor
218     //!
219     //! @since 2009/09/18 初版。
220     //!
221     virtual void SetVtxColorElement(u32 idx, u8 value);
222 
223     using Base::GetMaterial;
224 
225     //! @brief ペインが持つマテリアルの数を取得します。
226     //!
227     //! @details
228     //! Window ペインはコンテンツ領域+フレーム数のマテリアルを持ちます。
229     //!
230     //! @return フレーム数 + 1 を返します。
231     //!
232     //! @sa GetMaterial
233     //!
234     //! @since 2009/09/18 初版。
235     //!
236     virtual u8 GetMaterialNum() const;
237 
238     //! @brief ペインのマテリアルを取得します。
239     //!
240     //! @details
241     //! idx に指定する値は GetMaterialNum() の返り値未満でなければなりません。
242     //!
243     //! @param idx インデックスです。
244     //!
245     //! @return マテリアルへのポインタを返します。
246     //!
247     //! @sa GetMaterialNum
248     //! @sa GetContentMaterial
249     //! @sa SetContentMaterial
250     //! @sa GetFrameMaterial
251     //! @sa SetFrameMaterial
252     //!
253     //! @since 2009/09/18 初版。
254     //!
255     virtual Material* GetMaterial(u32 idx) const;
256 
257     //! @brief コンテント領域のマテリアルを取得します。
258     //!
259     //! @return マテリアルへのポインタを返します。
260     //!
261     //! @sa GetMaterial
262     //! @sa SetContentMaterial
263     //! @sa GetFrameMaterial
264     //! @sa SetFrameMaterial
265     //!
266     //! @since 2009/09/18 初版。
267     //!
268     Material* GetContentMaterial() const;
269 
270     //! @brief コンテント領域のマテリアルを設定します。
271     //!
272     //! @details
273     //! 現在設定されているマテリアルが Window オブジェクトの生成時に
274     //! 同時に生成されたものだった場合には、そのマテリアルは破棄されます。
275     //!
276     //! @param pMaterial マテリアルへのポインタです。
277     //!
278     //! @sa GetMaterial
279     //! @sa GetContentMaterial
280     //! @sa GetFrameMaterial
281     //! @sa SetFrameMaterial
282     //!
283     //! @since 2009/09/18 初版。
284     //!
285     void SetContentMaterial(Material* pMaterial);
286 
287     //! @brief ウィンドウフレーム領域のマテリアルを取得します。
288     //!
289     //! @param frameIdx フレームのインデックスです。
290     //!
291     //! @return マテリアルへのポインタを返します。
292     //!
293     //! @sa GetMaterial
294     //! @sa GetContentMaterial
295     //! @sa SetContentMaterial
296     //! @sa SetFrameMaterial
297     //!
298     //! @since 2009/09/18 初版。
299     //!
300     Material* GetFrameMaterial(WindowFrame frameIdx) const;
301 
302     //! @brief ウィンドウフレーム領域のマテリアルを設定します。
303     //!
304     //! @details
305     //! 現在設定されているマテリアルが Window オブジェクトの生成時に
306     //! 同時に生成されたものだった場合には、そのマテリアルは破棄されます。
307     //!
308     //! @param frameIdx フレームのインデックスです。
309     //! @param pMaterial マテリアルへのポインタです。
310     //!
311     //! @sa GetMaterial
312     //! @sa GetContentMaterial
313     //! @sa SetContentMaterial
314     //! @sa GetFrameMaterial
315     //!
316     //! @since 2009/09/18 初版。
317     //!
318     void SetFrameMaterial(WindowFrame frameIdx, Material* pMaterial);
319 
320     //! @brief コンテント領域で使うテクスチャ座標を保持するためのメモリ領域を確保します。
321     //!
322     //! @details
323     //! 保持可能なテクスチャ座標の数の初期値はコンテント領域のテクスチャ数と同じです。
324     //!
325     //! @param num テクスチャ座標の保持数です。
326     //!
327     //! @sa Window::Window
328     //!
329     //! @since 2009/09/18 初版。
330     //!
331     void ReserveTexCoord(u8 num);
332 
333     //! @brief コンテント領域で使うテクスチャ座標の保持数を取得します。
334     //!
335     //! @return 保持しているテクスチャ座標の数を返します。
336     //!
337     //! @sa SetTexCoordNum
338     //!
339     //! @since 2009/09/18 初版。
340     //!
341     u8 GetTexCoordNum() const;
342 
343     //! @brief コンテント領域で使うテクスチャ座標の保持数を設定します。
344     //!
345     //! @details
346     //! num に指定できる値は保持可能なテクスチャ座標数以下でなければなりません。
347     //!
348     //! @param num テクスチャ座標の保持数です。
349     //!
350     //! @sa ReserveTexCoord
351     //! @sa GetTexCoord
352     //!
353     //! @since 2009/09/18 初版。
354     //!
355     void SetTexCoordNum(u8 num);
356 
357     //! @brief コンテント領域で使うテクスチャ座標を取得します。
358     //!
359     //! @param idx インデックスです。
360     //! @param[out] coords テクスチャ座標を格納する領域へのポインタです。
361     //!
362     //! @since 2009/09/18 初版。
363     //!
364     void GetTexCoord(u32 idx, TexCoordQuad coords) const;
365 
366     //! @brief コンテント領域で使うテクスチャ座標を設定します。
367     //!
368     //! @param idx インデックスです。
369     //! @param coords テクスチャ座標です。
370     //!
371     //! @since 2009/09/18 初版。
372     //!
373     void SetTexCoord(u32 idx, const TexCoordQuad coords);
374 
375     //! @brief ウィンドウフレーム数を取得します。
376     //!
377     //! @details
378     //! ウィンドウフレームの数はオブジェクト生成時に決定されます。
379     //!
380     //! @return オブジェクトの生成方法によって 1, 4, 8 のいずれかを返します。
381     //!
382     //! @sa Window::Window
383     //!
384     //! @since 2009/09/18 初版。
385     //!
GetFrameNum()386     u8 GetFrameNum() const
387     {
388         return m_FrameNum;
389     }
390 
391     //@}
392 
393     //----------------------------------------
394     //! @name 検索
395     //@{
396 
397     //! @brief 名前でマテリアルを検索します。
398     //!
399     //! @details
400     //! findName のマテリアル名を持つマテリアルを検索します。
401     //!
402     //! bRecursive に true を渡した場合は子ペインと、子ペインが子を
403     //! 持つ場合はさらにその子ペインからも検索します。
404     //!
405     //! @param findName 検索するマテリアル名です。
406     //! @param bRecursive 子ペインも検索する場合は true を指定します。
407     //!
408     //! @return マテリアルが見つかった場合はそのマテリアルへのポインタを、
409     //! 見つからなかった場合は NULL を返します。
410     //!
411     //! @since 2009/09/18 初版。
412     //!
413     virtual Material* FindMaterialByName(
414         const char* findName,
415         bool bRecursive = true);
416 
417     //@}
418 
419 #ifdef NW_LYT_DMPGL_ENABLED
420 protected:
421     virtual void DrawSelf(const DrawInfo& drawInfo);
422 
423 private:
424     virtual void DrawContent(
425         const DrawInfo& draInfo,
426         const math::VEC2& basePt,
427         const WindowFrameSize& frameSize,
428         u8 alpha);
429 
430     virtual void DrawFrame(
431         const DrawInfo& draInfo,
432         const math::VEC2& basePt,
433         const Frame& frame,
434         const WindowFrameSize& frameSize,
435         u8 alpha);
436 
437     virtual void DrawFrame4(
438         const DrawInfo& draInfo,
439         const math::VEC2& basePt,
440         const Frame* frames,
441         const WindowFrameSize& frameSize,
442         u8 alpha);
443 
444     virtual void DrawFrame8(
445         const DrawInfo& draInfo,
446         const math::VEC2& basePt,
447         const Frame* frames,
448         const WindowFrameSize& frameSize,
449         u8 alpha);
450 
451 #endif // NW_LYT_DMPGL_ENABLED
452 
453 private:
454     const WindowFrameSize GetFrameSize(
455         u8 frameNum,
456         const Frame* frames) const;
457 
458     void InitTexNum(
459         u8 contentTexNum,
460         u8 frameTexNums[],
461         u8 frameNum);
462 
463     void InitContent(u8 texNum);
464 
465     void InitFrame(u8 frameNum);
466 
467 #ifdef NW_LYT_DRAWER_ENABLE
468   public :
469 
470     virtual void MakeUniformDataSelf( DrawInfo* pDrawInfo, Drawer* pDrawer ) const;
471 
472   private : // 処理削減のためにDrawer が使う
473 
474     // テクスチャ座標が初期化済みかどうか
475     mutable bool m_IsTexCoordInited;
476 
477     // テクスチャ座標の数のキャッシュ
478     mutable u32 m_UniformTexCoordNum;
479 
480     // テクスチャ座標のキャッシュ
481     mutable nw::math::VEC4 m_UniformTexCoords[ TexMapMax * 2 ];
482 
483 #endif
484 
485 private:
486     // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。
487     Window(const Window& other);
488     Window& operator = (const Window& other);
489 
490 private:
491     InflationLRTB m_ContentInflation;
492     Content m_Content;
493     Frame* m_Frames;
494     u8 m_FrameNum;
495     Material* m_pMaterial;
496 };
497 
498 } // namespace nw::lyt
499 } // namespace nw
500 
501 #endif // NW_LYT_WINDOW_H_
502 
503