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: 26780 $
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 protected:
424     //! @details :private
425     virtual void DrawContent(
426         const DrawInfo& draInfo,
427         const math::VEC2& basePt,
428         const WindowFrameSize& frameSize,
429         u8 alpha);
430 
431     //! @details :private
432     virtual void DrawFrame(
433         const DrawInfo& draInfo,
434         const math::VEC2& basePt,
435         const Frame& frame,
436         const WindowFrameSize& frameSize,
437         u8 alpha);
438 
439     //! @details :private
440     virtual void DrawFrame4(
441         const DrawInfo& draInfo,
442         const math::VEC2& basePt,
443         const Frame* frames,
444         const WindowFrameSize& frameSize,
445         u8 alpha);
446 
447     //! @details :private
448     virtual void DrawFrame8(
449         const DrawInfo& draInfo,
450         const math::VEC2& basePt,
451         const Frame* frames,
452         const WindowFrameSize& frameSize,
453         u8 alpha);
454 
455 #endif // NW_LYT_DMPGL_ENABLED
456 
457 protected:
458     //! @details :private
459     const WindowFrameSize GetFrameSize(
460         u8 frameNum,
461         const Frame* frames) const;
462 
463     //! @details :private
464     void InitTexNum(
465         u8 contentTexNum,
466         u8 frameTexNums[],
467         u8 frameNum);
468 
469     //! @details :private
470     void InitContent(u8 texNum);
471 
472     //! @details :private
473     void InitFrame(u8 frameNum);
474 
475 #ifdef NW_LYT_DRAWER_ENABLE
476 public:
477 
478     virtual void MakeUniformDataSelf( DrawInfo* pDrawInfo, Drawer* pDrawer ) const;
479 
480 protected: // 処理削減のためにDrawer が使う
481 
482     //! @details :private
483     //! テクスチャ座標が初期化済みかどうか
484     mutable bool m_IsTexCoordInited;
485 
486     //! @details :private
487     //! テクスチャ座標の数のキャッシュ
488     mutable u32 m_UniformTexCoordNum;
489 
490     //! @details :private
491     //! テクスチャ座標のキャッシュ
492     mutable nw::math::VEC4 m_UniformTexCoords[ TexMapMax * 2 ];
493 
494 #endif
495 
496 protected:
497     //! @details :private
498     InflationLRTB m_ContentInflation;
499 
500     //! @details :private
501     Content m_Content;
502 
503     //! @details :private
504     Frame* m_Frames;
505 
506     //! @details :private
507     u8 m_FrameNum;
508 
509     //! @details :private
510     Material* m_pMaterial;
511 
512 private:
513     // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。
514     Window(const Window& other);
515     Window& operator = (const Window& other);
516 };
517 
518 } // namespace nw::lyt
519 } // namespace nw
520 
521 #endif // NW_LYT_WINDOW_H_
522 
523