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