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