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