1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Drawer.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_DRAWER_H_
17 #define NW_LYT_DRAWER_H_
18 
19 // 高速化実験を有効にする
20 #ifdef NW_PLATFORM_CTR
21 #define NW_LYT_DRAWER_ENABLE 1
22 #endif
23 
24 #include <nw/font/font_RectDrawer.h>
25 
26 #ifdef NW_LYT_DRAWER_ENABLE
27 //--------------------------------------
28 // 動作設定
29 
30 // ASSERT
31 #if 1
32 #define NW_LYT_DRAWER_GL_ASSERT()      NW_GL_ASSERT()
33 #define NW_LYT_DRAWER_ASSERT( x )      NW_ASSERT( x )
34 #define NW_LYT_DRAWER_NULL_ASSERT( x ) NW_NULL_ASSERT( x )
35 #else
36 #define NW_LYT_DRAWER_ASSERT( x )
37 #define NW_LYT_DRAWER_GL_ASSERT()
38 #define NW_LYT_DRAWER_NULL_ASSERT( x )
39 #endif
40 
41 // 必要のない機能であれば削れば速いかも
42 #define NW_LYT_DRAWER_ENABLE_ALPHA_TEST   1
43 #define NW_LYT_DRAWER_ENABLE_BLEND_FUNC   1
44 #define NW_LYT_DRAWER_ENABLE_USER_TEX_ENV 1
45 
46 //----------------------------------------------------------
47 // マクロ
48 
49 // nngxValidateState
50 #ifdef NW_FONT_RECTDRAWER_USE_DRAW_ARRAYS
51 #define NW_LYT_DRAWER_VALIDATE( state_mask ) \
52     nngxValidateState( state_mask, GL_FALSE )
53 #else
54 #define NW_LYT_DRAWER_VALIDATE( state_mask ) \
55     nngxValidateState( state_mask, GL_TRUE )
56 #endif
57 
58 #if 0
59 #define NW_LYT_DRAWER_ALIGN_32 __attribute__((aligned(32)))
60 #else
61 #define NW_LYT_DRAWER_ALIGN_32
62 #endif
63 
64 //----------------------------------------------------------
65 // 実験用
66 
67 // PictureのDrawを切る
68 // #define NW_LYT_DRAWER_DISABLE_DRAW_PICTURE           1
69 
70 // TextBoxのDrawを切る
71 // #define NW_LYT_DRAWER_DISABLE_DRAW_TEXTBOX           1
72 
73 // WindowのDrawを切る
74 // #define NW_LYT_DRAWER_DISABLE_DRAW_WINOOW            1
75 
76 // UniformDataのPRINT
77 // #define NW_LYT_DRAWER_PRINT_UNIFORM_DATA             1
78 
79 
80 //----------------------------------------------------------
81 
82 #include <GLES2/gl2.h>
83 #include <GLES2/gl2ext.h>
84 #include <nw/lyt/lyt_Types.h>
85 #include <nw/ut/ut_Color.h>
86 
87 namespace nw { namespace lyt {
88 
89 class Layout;
90 class Pane;
91 class Material;
92 class DrawInfo;
93 class Material;
94 class TexMap;
95 class TextBox;
96 class GraphicsResource;
97 
98 //---------------------------------------------------------------------------
99 //! :category 描画
100 //!
101 //! @brief 高速描画クラスです。
102 //!
103 //! @details
104 //! レイアウトを高速に描画します。
105 //!
106 //! Layout::Draw() の代わりに使用します。
107 //!
108 //!  nw::lyt::Drawer drawer(graphicsResource);\n
109 //!  \n
110 //!  pLayout->Animate();\n
111 //!  pLayout->CalculateMtx(drawInfo);\n
112 //!  \n
113 //!  // ユーザの行うGL設定。\n
114 //!  InitGX();\n
115 //!  \n
116 //!  drawer.DrawBegin(drawInfo);\n
117 //!  drawer.Draw(pLayout, drawInfo);\n
118 //!  drawer.DrawEnd(drawInfo);\n
119 //!  \n
120 //!  // DMPGLステートの一貫性を回復します。\n
121 //!  nngxUpdateState(NN_GX_STATE_ALL);
122 //!
123 //! GLの以下の設定はユーザに任せています(lytでは設定しません)。
124 //!
125 //! ・カリング\n
126 //! ・シザー処理\n
127 //! ・ステンシルテスト\n
128 //! ・マスク処理\n
129 //! ・ポリゴンオフセット\n
130 //! ・デプステスト\n
131 //! ・アーリーデプステスト\n
132 //! ・フレームバッファオブジェクト
133 //!
134 //! 設定方法については simple デモのソースを確認してください
135 //! (Drawer は通常のGL関数を使わないため、設定方法が複雑です)。
136 //!
137 //! Drawer の描画関数を使用すると DMPGL ステートが一貫性の無い状態になります。
138 //!
139 //! Drawerの使用後に GL の関数を使用する前には nngxUpdateState() 呼び出しを行ってください。
140 //!
141 //! @since 2010/05/14 初版。DrawManagerを置き換えました。
142 //! @date 2010/09/24 Drawerの初期化後のnngxUpdateState()呼び出しは必要なくなりました。
143 //!
144 //---------------------------------------------------------------------------
145 class Drawer : public font::RectDrawer
146 {
147     typedef RectDrawer  Base;
148 
149 public:
150 
151     //----------------------------------------
152     //! @name コンストラクタ/デストラクタ
153     //@{
154 
155     //! @brief コンストラクタです。
156     //!
157     //! @details
158     //! Initialize() による初期化が必要です。
159     //!
160     //! @sa Initialize
161     //!
162     //! @since 2010/05/14 初版。
163     //!
164     Drawer();
165 
166     //! @brief コンストラクタです。
167     //!
168     //! @details
169     //! オブジェクトの構築と Initialize() の呼び出しを行います。
170     //!
171     //! @param graphicsResource  GraphicsResource を指定します。
172     //!
173     //! @since 2010/04/12 初版。
174     //!
175     explicit Drawer( GraphicsResource& graphicsResource );
176 
177     //@}
178 
179     //----------------------------------------
180     //! @name 初期化/後処理
181     //@{
182 
183     //! @brief 初期化を行います。
184     //!
185     //! @param graphicsResource GraphicsResource を指定します。
186     //! @param vertexBuffer  頂点用バッファ。
187     //!
188     //! @sa Finalize
189     //!
190     //! @since 2010/05/14 初版。
191     //! @date 2010/09/24 nngxUpdateState()の呼び出しは必要なくなりました。
192     //!
193     void Initialize( GraphicsResource& graphicsResource,
194                      void* vertexBuffer = NULL );
195 
196 protected:
197     //! @details :private
Initialize(void * vtxBufCmdBuf,const void * shaderBinary,u32 size)198     void Initialize( void*       vtxBufCmdBuf,
199                      const void* shaderBinary,
200                      u32         size
201     )
202     {
203         Base::Initialize(vtxBufCmdBuf, shaderBinary, size);
204     }
205 
206     //! @details :private
Initialize(void * vertexBuffer,void * commandBuffer,const void * shaderBinary,u32 size)207     void Initialize( void*       vertexBuffer,
208                      void*       commandBuffer,
209                      const void* shaderBinary,
210                      u32         size
211     )
212     {
213         Base::Initialize(vertexBuffer, commandBuffer, shaderBinary, size);
214     }
215 
216 public:
217     //! @brief      開放を行います。
218     //!
219     //! @sa         Initialize
220     //!
221     //! @since      2010/06/02 初版。
222     //!
223     virtual void        Finalize();
224 
225     //@}
226 
227 public:
228     //----------------------------------------
229     //! @name 描画
230     //@{
231 
232     //! @brief 描画を開始します。
233     //!
234     //! @param drawInfo DrawInfo を指定します。
235     //!
236     //! @sa Draw
237     //! @sa DrawEnd
238     //!
239     //! @details
240     //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。
241     //! 以後に GL 関数を使用する場合は nngxUpdateState()
242     //! 呼び出しを行ってください。
243     //!
244     //! @since 2010/05/14 初版。StartCmdList より改名しました。
245     //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。
246     //!
247     void DrawBegin( const DrawInfo& drawInfo );
248 
249     //! @details :private
250     virtual void DrawBegin(u32 flag = 0);
251 
252     //! @brief レイアウトを描画します。
253     //!
254     //! @details
255     //! DrawBegin(), DrawEnd() の間で複数回の Draw() を行うことができます。
256     //!
257     //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。
258     //! 以後に GL 関数を使用する場合は nngxUpdateState()
259     //! 呼び出しを行ってください。
260     //!
261     //! @param pLayout Layout を指定します。
262     //! @param drawInfo DrawInfo を指定します。
263     //!
264     //! @sa DrawBegin
265     //! @sa DrawEnd
266     //!
267     //! @since 2010/05/14 初版。AddCmdList より改名しました。
268     //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。
269     //!
270     void Draw( const Layout* pLayout, DrawInfo& drawInfo );
271 
272     //! @brief ペインを描画します。
273     //!
274     //! @details
275     //! 指定したペインおよびその子階層のペインを描画します。
276     //!
277     //! DrawBegin(), DrawEnd() の間で複数回の Draw() を行うことができます。
278     //!
279     //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。
280     //! 以後に GL 関数を使用する場合は nngxUpdateState()
281     //! 呼び出しを行ってください。
282     //!
283     //! @param pPane Pane を指定します。
284     //! @param drawInfo DrawInfo を指定します。
285     //!
286     //! @sa DrawBegin
287     //! @sa DrawEnd
288     //!
289     //! @since 2010/05/14 初版。AddCmdList より改名しました。
290     //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。
291     //!
292     void Draw( const Pane* pPane, DrawInfo& drawInfo );
293 
294     //! @brief 描画を終了します。
295     //!
296     //! @param drawInfo DrawInfo を指定します。
297     //!
298     //! @details
299     //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。
300     //! 以後に GL 関数を使用する場合は nngxUpdateState()
301     //! 呼び出しを行ってください。
302     //!
303     //! @sa DrawBegin
304     //! @sa Draw
305     //!
306     //! @since 2010/05/14 初版。UseCmdList より改名しました。
307     //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。
308     //!
DrawEnd(const DrawInfo &)309     void DrawEnd( const DrawInfo& /* drawInfo */ )
310     {
311         u32 flag = 0;
312         DrawEnd(flag);
313     }
314 
315     //! @details :private
316     virtual void DrawEnd(u32 flag = 0);
317 
318     //@}
319 
320 public:
321 
322     //! @details :private
323     void DumpCmdList();
324 
325     //! @details :private
326     void SetUpTexEnv( const Material* pMaterial );
327 
328     //! @details :private
329     void SetUpTextures( const Material* pMaterial, bool addDisableCommand = true);
330 
331     //! @details :private
332     void SetUpTextureCoords( const nw::math::VEC4 texCoords[ TexMapMax * 2 ],
333                              const int texCoordNum );
334 
335     //! @details :private
336     void SetUpVtxColors( const nw::ut::Color8 vtxColors[VERTEX_MAX],
337                          const u8 globalAlpha );
338 
339     //! @details :private
340     void SetUpTextBox( const TextBox* pTextBox,
341                        const Material* pMaterial,
342                        const DrawInfo& drawInfo );
343 
344     //! @details :private
345     void SetUpMtx( const nw::math::MTX34& mtx );
346 
347     //! @details :private
348     void SetUpQuad( const nw::lyt::Size& size,
349                     const nw::math::VEC2& basePt );
350 
351     //! @details :private
352     void SetUniformDataEnd();
353 
354     //! @details :private
355     void SetCurrentUniformAlpha( const f32 alpha );
356 
357     //! @details :private
358     u8 CalcTextureCoords( const Material* pMaterial,
359                           const TexCoordQuad* pTexCoordQuad,
360                           nw::math::VEC4 texCoords[ TexMapMax * 2 ] ) const;
361 
362     //! @brief      バッファの内容を書き出します。
363     //!
FlushBuffer()364     void FlushBuffer()
365     {
366 #ifdef NW_FONT_RECTDRAWER_USE_DRAW_BUFFER
367         if (m_UniformAddrIndex > 0)
368         {
369             UniformAndDraw();
370         }
371 #endif
372     }
373 
374 protected:
375     //! @details :private
376     void UniformAndDraw();
377 
378     //! @details :private
379     void SetUpTexEnvType2( const Material* pMaterial );
380 
381     //! @details :private
382     void SetUpTexEnvType3( const Material* pMaterial );
383 
384 #ifdef NW_LYT_DRAWER_ENABLE_USER_TEX_ENV
385     //! @details :private
386     void SetUpGLTexEnvUser( const Material* pMaterial );
387 #endif
388 
389 #ifdef NW_LYT_DRAWER_ENABLE_BLEND_FUNC
390     //! @details :private
391     void SetUpBlendMode(   const Material* pMaterial );
392 #endif
393 
394 #ifdef NW_LYT_DRAWER_ENABLE_ALPHA_TEST
395     //! @details :private
396     void SetUpAlphaTest(   const Material* pMaterial );
397 #endif
398 
399 protected: ////////////////////////////// Command
400     //! @details :private
401     GLuint m_PrevTexObj;
402 
403     //! @details :private
404     int m_ActiveTexureNum;
405 
406     //! @details :private
407     int m_TexCoordNum;
408 
409     //! @details :private
410     bool m_IsBlendDefault;
411 
412     //! @details :private
413     bool m_AlphaTestEnable;
414 
415 protected: ////////////////////////////// Texture Combiner
416 
417     //! @details :private
418     enum TEX_ENV_TYPE
419     {
420         TEX_ENV_TYPE_0_TEX,
421         TEX_ENV_TYPE_1_TEX,
422         TEX_ENV_TYPE_2_TEX,
423         TEX_ENV_TYPE_3_TEX,
424         TEX_ENV_TYPE_TEXT,
425         TEX_ENV_TYPE_USER,
426         TEX_ENV_TYPE_NUM
427     };
428 
429     //! @details :private
430     TEX_ENV_TYPE m_CurrentTexEnvType;
431 
432 #if ! defined(NW_RELEASE)
433     //! @details :private
434     TEX_ENV_TYPE m_PreviousTexEnvType;
435 #endif
436 
437     //! @details :private
438     enum
439     {
440         TEX_ENV_UNIFORM_NUM = 8,
441 #ifdef NW_TARGET_CTR_GL_FINAL
442         TEX_ENV_STAGE_NUM = 6,
443 #else
444         TEX_ENV_STAGE_NUM = 3,
445 #endif
446         TEX_ENV_UNIFORM_VALUE_NUM = 16
447     };
448 };
449 
450 }}
451 #endif  // #ifdef NW_LYT_DRAWER_ENABLE
452 
453 #endif
454