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