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: 23845 $
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   private:
375     void UniformAndDraw();
376     void SetUpTexEnvType2( const Material* pMaterial );
377     void SetUpTexEnvType3( const Material* pMaterial );
378 
379 #ifdef NW_LYT_DRAWER_ENABLE_USER_TEX_ENV
380     void SetUpGLTexEnvUser( const Material* pMaterial );
381 #endif
382 
383 #ifdef NW_LYT_DRAWER_ENABLE_BLEND_FUNC
384     void SetUpBlendMode(   const Material* pMaterial );
385 #endif
386 
387 #ifdef NW_LYT_DRAWER_ENABLE_ALPHA_TEST
388     void SetUpAlphaTest(   const Material* pMaterial );
389 #endif
390 
391   private: ////////////////////////////// Command
392     GLuint m_PrevTexObj;
393     int m_ActiveTexureNum;
394     int m_TexCoordNum;
395     bool m_IsBlendDefault;
396     bool m_AlphaTestEnable;
397 
398   private : ////////////////////////////// Texture Combiner
399 
400     //! @details :private
401     enum TEX_ENV_TYPE
402     {
403         TEX_ENV_TYPE_0_TEX,
404         TEX_ENV_TYPE_1_TEX,
405         TEX_ENV_TYPE_2_TEX,
406         TEX_ENV_TYPE_3_TEX,
407         TEX_ENV_TYPE_TEXT,
408         TEX_ENV_TYPE_USER,
409         TEX_ENV_TYPE_NUM
410     };
411 
412     TEX_ENV_TYPE m_CurrentTexEnvType;
413 #if ! defined(NW_RELEASE)
414     TEX_ENV_TYPE m_PreviousTexEnvType;
415 #endif
416 
417     //! @details :private
418     enum
419     {
420         TEX_ENV_UNIFORM_NUM = 8,
421 #ifdef NW_TARGET_CTR_GL_FINAL
422         TEX_ENV_STAGE_NUM = 6,
423 #else
424         TEX_ENV_STAGE_NUM = 3,
425 #endif
426         TEX_ENV_UNIFORM_VALUE_NUM = 16
427     };
428 };
429 
430 }}
431 #endif  // #ifdef NW_LYT_DRAWER_ENABLE
432 
433 #endif
434