1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Types.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_TYPES_H_
17 #define NW_LYT_TYPES_H_
18 
19 #include <cstddef>
20 #include <nw/types.h>
21 
22 #include <nw/math/math_Types.h>
23 #include <nw/ut/ut_BinaryFileFormat.h>
24 #include <nw/ut/ut_LinkList.h>
25 #include <nw/font/font_DrawerTypes.h>
26 
27 namespace nw
28 {
29 namespace lyt
30 {
31 
32 //! @name リソース
33 //@{
34 
35 //! リソースの名前文字列の最大文字数です。
36 const   int     ResourceNameStrMax  = 16;
37 //! マテリアルの名前文字列の最大文字数です。
38 const   int     MaterialNameStrMax  = ResourceNameStrMax + 4;
39 //! ユーザーデータの名前文字列の最大文字数です。
40 const   int     UserDataStrMax      = 8;
41 //! テクスチャの最大数です。
42 const   int     TexMapMax           = 3;
43 //! TEVステージの最大数です。
44 const   int     TevStageMax         = 6;
45 //! マテリアルカラーの最大数です。
46 const   int     MatColorMax         = 7;
47 
48 //@}
49 
50 namespace internal
51 {
52 
53 //! テクスチャユニットの数です。
54 const   int     TexUnitMax          = 4;
55 //! TexEnvユニットの数です。
56 #ifdef NW_TARGET_CTR_GL_FINAL
57 const   int     TexEnvUnitMax       = 6;
58 #else
59 const   int     TexEnvUnitMax       = 3;
60 #endif
61 
62 template <typename T>
63 __forceinline
64 T
SetBit(T bits,int pos,bool val)65 SetBit(
66     T       bits,
67     int     pos,
68     bool    val
69 )
70 {
71     const T mask = T(~(1 << pos));
72 
73     bits &= mask;
74     bits |= (val ? 1: 0) << pos;
75 
76     return bits;
77 }
78 
79 template <typename T>
80 __forceinline
81 void
SetBit(T * pBits,int pos,bool val)82 SetBit(
83     T*      pBits,
84     int     pos,
85     bool    val
86 )
87 {
88     const T mask = T(~(1 << pos));
89 
90     *pBits &= mask;
91     *pBits |= (val ? 1: 0) << pos;
92 }
93 
94 using nw::ut::internal::TestBit;
95 
96 template <typename T>
97 __forceinline
98 T
SetBits(T bits,int pos,int len,T val)99 SetBits(
100     T       bits,
101     int     pos,
102     int     len,
103     T       val
104 )
105 {
106     NW_ASSERT(len <= 32);
107     const u32 MaxValue = 0xFFFFFFFFU >> (32 - len);
108     NW_ASSERT(val <= MaxValue);
109 
110     const T mask = T(~(MaxValue << pos));
111 
112     bits &= mask;
113     bits |= val << pos;
114 
115     return bits;
116 }
117 
118 template <typename T>
119 __forceinline
120 void
SetBits(T * pBits,int pos,int len,T val)121 SetBits(
122     T*      pBits,
123     int     pos,
124     int     len,
125     T       val
126 )
127 {
128     NW_ASSERT(len <= 32);
129     const u32 MaxValue = 0xFFFFFFFFU >> (32 - len);
130     NW_ASSERT(val <= MaxValue);
131 
132     const T mask = T(~(MaxValue << pos));
133 
134     *pBits &= mask;
135     *pBits |= val << pos;
136 }
137 
138 using nw::ut::internal::GetBits;
139 
140 template<typename T>
141 __forceinline
142 const T*
ConvertOffsToPtr(const void * baseAddress,unsigned int offset)143 ConvertOffsToPtr(const void* baseAddress, unsigned int offset)
144 {
145     return
146         reinterpret_cast<const T*>(
147             static_cast<const u8*>(baseAddress) + offset
148         );
149 }
150 
151 template<typename T>
152 __forceinline
153 T*
ConvertOffsToPtr(void * baseAddress,unsigned int offset)154 ConvertOffsToPtr(void* baseAddress, unsigned int offset)
155 {
156     return
157         reinterpret_cast<T*>(
158             static_cast<u8*>(baseAddress) + offset
159         );
160 }
161 
162 #if 0
163 //#if defined(WIN32)
164 
165 inline
166 u16
167 SwapInt(u16 val)
168 {
169     return u16((val << 8) | (val >> 8));
170 }
171 
172 inline
173 s16
174 SwapInt(s16 val)
175 {
176     const u16 ret= SwapInt(*reinterpret_cast<const u16*>(&val));
177     return *reinterpret_cast<const s16*>(&ret);
178 }
179 
180 inline
181 u32
182 SwapInt(u32 val)
183 {
184     return (val << 24) | ((val << 8) & 0x00FF0000) | ((val >> 8) & 0x0000FF00) | (val >> 24);
185 }
186 
187 inline
188 s32
189 SwapInt(s32 val)
190 {
191     const u32 ret= SwapInt(*reinterpret_cast<const u32*>(&val));
192     return *reinterpret_cast<const s32*>(&ret);
193 }
194 
195 template<typename T>
196 class ResNum
197 {
198 public:
199             ResNum() {}                                                             // デフォルトコンストラクタ
200 
201             ResNum(const ResNum& other) : m_Bits(other.m_Bits) {}                       // コピーコンストラクタ
202 
203             ResNum(const T val)         : m_Bits(internal::SwapInt(val)) {}             // T からの構築
204 
205     void    operator = (const ResNum& other)    { m_Bits = other.m_Bits; }              // 代入演算子
206 
207             operator T () const                 { return internal::SwapInt(m_Bits); }   // T への変換演算子
208 
209     void    operator = (T val)                  { m_Bits = internal::SwapInt(val);  }   // T からのセット
210 
211 protected:
212     T       m_Bits;
213 };
214 
215 template <>
216 class ResNum<f32>
217 {
218 public:
219             ResNum() {}                                                         // デフォルトコンストラクタ
220 
221             ResNum(const ResNum& other) : m_Bits(other.m_Bits) {}                   // コピーコンストラクタ
222 
223             ResNum(const f32 val)                                               // T からの構築
224             {
225                 union {
226                     u32 u32;
227                     f32 f32;
228                 } value;
229                 value.f32 = val;
230                 m_Bits = internal::SwapInt(value.u32);
231             }
232 
233     void    operator = (const ResNum& other)    { m_Bits = other.m_Bits; }          // 代入演算子
234 
235             operator f32 () const                                               // T への変換演算子
236             {
237                 union {
238                     u32 u32;
239                     f32 f32;
240                 } value;
241                 value.u32 = internal::SwapInt(m_Bits);
242                 return value.f32;
243             }
244 
245     void    operator = (f32 val)                                                // T からのセット
246             {
247                 union {
248                     u32 u32;
249                     f32 f32;
250                 } value;
251                 value.f32 = val;
252                 m_Bits = internal::SwapInt(value.u32);
253             }
254 
255 protected:
256     u32    m_Bits;
257 };
258 
259 typedef ResNum<s16> ResS16;
260 typedef ResNum<u16> ResU16;
261 typedef ResNum<s32> ResS32;
262 typedef ResNum<u32> ResU32;
263 typedef ResNum<f32> ResF32;
264 
265 #else // #if defined(WIN32)
266 
267 typedef s16         ResS16;
268 typedef u16         ResU16;
269 typedef s32         ResS32;
270 typedef u32         ResU32;
271 typedef f32         ResF32;
272 
273 #endif // #if defined(WIN32)
274 
275 } // namespace nw::lyt::internal
276 
277 //! @name 描画
278 //@{
279 
280 //---------------------------------------------------------------------------
281 //! :private (削除予定)
282 //!
283 //! @brief ペインの種類です。
284 //!
285 //! @since 2010/03/26 初版。
286 //---------------------------------------------------------------------------
287 enum PaneType
288 {
289     //! その他のペインです。
290     PANETYPE_OTHER,
291     //! ヌルペインです。
292     PANETYPE_NULL,
293     //! ピクチャペインです。
294     PANETYPE_PICTURE,
295     //! ウィンドウペインです。
296     PANETYPE_WINDOW,
297     //! テキストボックスペインです。
298     PANETYPE_TEXTBOX,
299     //! バウンディングペインです。
300     PANETYPE_BOUNDING,
301 
302     //! 列挙子の総数です。
303     PANETYPE_MAX
304 };
305 
306 //---------------------------------------------------------------------------
307 //! @brief ペインの表示設定に使用します。
308 //!
309 //! @date 2010/04/09 PANEFLAG_MTXCONDITION, PANEFLAG_USERMTX を追加しました。
310 //! @date 2010/03/26 PANEFLAG_USERALLOCATED を追加しました。
311 //! @since 2009/09/18 初版。
312 //---------------------------------------------------------------------------
313 enum PaneFlag
314 {
315     //! ペインを表示するかどうかのフラグです。
316     PANEFLAG_VISIBLE,
317     //! 子のペインに親ペインのアルファ値が影響するかどうかのフラグです。
318     PANEFLAG_INFLUENCEDALPHA,
319     //! ペインが位置調整処理の対象となるかどうかのフラグです。
320     PANEFLAG_LOCATIONADJUST,
321     //! ユーザが作成したペインをあらわすフラグです。
322     PANEFLAG_USERALLOCATED,
323     //! ローカルMTXの状態をあらわします(1ビット目)。
324     PANEFLAG_MTXCONDITION,
325     //! ローカルMTXの状態をあらわします(2ビット目)。
326     PANEFLAG_MTXCONDITION_1,
327     //! SRT 行列はユーザによって指定された値です(再計算禁止)。
328     PANEFLAG_USERMTX,
329     //! グローバル行列はユーザによって指定された値です(再計算禁止)。
330     PANEFLAG_USERGLOBALMTX,
331 
332     //! 使用するビット数の合計です。
333     PANEFLAG_MAX,
334 
335     //! PANEFLAG_MTXCONDITIONのビット数です。
336     PANEFLAG_MTXCONDITION_LENGTH = 2
337 };
338 
339 //---------------------------------------------------------------------------
340 //! @brief ペインのグローバル行列の状態を表します。
341 //!
342 //! @since 2010/04/09 初版。
343 //---------------------------------------------------------------------------
344 enum MtxCondition
345 {
346     //! 行列は再計算が必要です。
347     MTXCONDITION_DIRTY,
348     //! 行列は最新の状態で計算されています。
349     MTXCONDITION_CLEAN,
350     //! 行列は最新の状態で計算されています(Location Adjust 付き)。
351     MTXCONDITION_CLEAN_LOCATION_ADJUST,
352 
353     //! 列挙子の総数です。
354     MTXCONDITION_MAX
355 };
356 
357 //---------------------------------------------------------------------------
358 //! @brief 表示の水平方向の基準位置に関する列挙子です。
359 //!
360 //! @since 2009/09/18 初版。
361 //---------------------------------------------------------------------------
362 enum HorizontalPosition
363 {
364     //! 左を基準にします。
365     HORIZONTALPOSITION_LEFT,
366     //! 中央を基準にします。
367     HORIZONTALPOSITION_CENTER,
368     //! 右を基準にします。
369     HORIZONTALPOSITION_RIGHT,
370 
371     //! 列挙子の総数です。
372     HORIZONTALPOSITION_MAX
373 };
374 
375 //---------------------------------------------------------------------------
376 //! @brief  	表示の垂直方向の基準位置に関する列挙子です。
377 //!
378 //! @since 2009/09/18 初版。
379 //---------------------------------------------------------------------------
380 enum VerticalPosition
381 {
382     //! 上を基準にします。
383     VERTICALPOSITION_TOP,
384     //! 中央を基準にします。
385     VERTICALPOSITION_CENTER,
386     //! 下を基準にします。
387     VERTICALPOSITION_BOTTOM,
388 
389     //! 列挙子の総数です。
390     VERTICALPOSITION_MAX
391 };
392 
393 //---------------------------------------------------------------------------
394 //! @brief テクスチャフォーマットの列挙子です。
395 //!
396 //! @since 2009/09/18 初版。
397 //---------------------------------------------------------------------------
398 enum TexFormat
399 {
400     //! L8です。
401     TEXFORMAT_L8,
402     //! A8です。
403     TEXFORMAT_A8,
404     //! LA4です。
405     TEXFORMAT_LA4,
406     //! LA8です。
407     TEXFORMAT_LA8,
408     //! HILO8です。
409     TEXFORMAT_HILO8,
410     //! RGB565です。
411     TEXFORMAT_RGB565,
412     //! RGB8です。
413     TEXFORMAT_RGB8,
414     //! RGB5A1です。
415     TEXFORMAT_RGB5A1,
416     //! RGBA4です。
417     TEXFORMAT_RGBA4,
418     //! RGBA8です。
419     TEXFORMAT_RGBA8,
420     //! ETC1です。
421     TEXFORMAT_ETC1,
422     //! ETC1A4です。
423     TEXFORMAT_ETC1A4,
424     //! L4です。
425     TEXFORMAT_L4,
426     //! A4です。
427     TEXFORMAT_A4,
428 
429     //! 列挙子の総数です。
430     TEXFORMAT_MAX
431 };
432 
433 //---------------------------------------------------------------------------
434 //! @brief テクスチャのラップモードを表す列挙子です。
435 //!
436 //! @since 2009/09/18 初版。
437 //---------------------------------------------------------------------------
438 enum TexWrap
439 {
440     //! クランプします。
441     TEXWRAP_CLAMP,
442     //! 繰り返します。
443     TEXWRAP_REPEAT,
444     //! ミラーします。
445     TEXWRAP_MIRROR,
446 
447     //! 列挙子の総数です。
448     TEXWRAP_MAX
449 };
450 
451 //---------------------------------------------------------------------------
452 //! @brief テクスチャフィルターのモードを表す列挙子です。
453 //!
454 //! @since 2009/09/18 初版。
455 //---------------------------------------------------------------------------
456 enum TexFilter
457 {
458     //! NEARフィルターモードです。
459     TEXFILTER_NEAR,
460     //! LINEARフィルターモードです。
461     TEXFILTER_LINEAR,
462 
463     //! 列挙子の総数です。
464     TEXFILTER_MAX
465 };
466 
467 //---------------------------------------------------------------------------
468 //! @brief Tevの演算モードを表す列挙子です。
469 //!
470 //! @since 2009/09/18 初版。
471 //---------------------------------------------------------------------------
472 enum TevMode
473 {
474     //! REPLACEモードです。
475     TEVMODE_REPLACE,
476     //! MODULATEモードです。
477     TEVMODE_MODULATE,
478     //! ADDモードです。
479     TEVMODE_ADD,
480     //! ADD_SIGNEDモードです。
481     TEVMODE_ADD_SIGNED,
482     //! INTERPOLATEモードです。
483     TEVMODE_INTERPOLATE,
484     //! SUBTRACTモードです。
485     TEVMODE_SUBTRACT,
486     //! ADD_MULTモードです。
487     TEVMODE_ADD_MULT,
488     //! MULT_ADDモードです。
489     TEVMODE_MULT_ADD,
490 
491     //! 列挙子の総数です。
492     TEVMODE_MAX
493 };
494 
495 //---------------------------------------------------------------------------
496 //! @brief Tevの入力のソースを表す列挙子です。
497 //!
498 //! @since 2009/09/18 初版。
499 //---------------------------------------------------------------------------
500 enum TevSrc
501 {
502     //! TEXTURE0を使用します。
503     TEVSRC_TEXTURE0,
504     //! TEXTURE1を使用します。
505     TEVSRC_TEXTURE1,
506     //! TEXTURE2を使用します。
507     TEVSRC_TEXTURE2,
508     //! TEXTURE3を使用します。
509     TEVSRC_TEXTURE3,
510     //! CONSTANTを使用します。
511     TEVSRC_CONSTANT,
512     //! PRIMARYを使用します。
513     TEVSRC_PRIMARY,
514     //! 前段の出力を使用します。
515     TEVSRC_PREVIOUS,
516     //! 前段のバッファを使用しますす。
517     TEVSRC_PREVIOUS_BUFFER,
518 
519     //! 列挙子の総数です。
520     TEVSRC_MAX
521 };
522 
523 //---------------------------------------------------------------------------
524 //! @brief Tevの入力のRGBのオペランドを指定する列挙子です。
525 //!
526 //! @since 2009/09/18 初版。
527 //---------------------------------------------------------------------------
528 enum TevOpRgb
529 {
530     //! RGBモードです。
531     TEVOPRGB_RGB,
532     //! INV_RGBモードです。
533     TEVOPRGB_INV_RGB,
534     //! ALPHAモードです。
535     TEVOPRGB_ALPHA,
536     //! INV_ALPHAモードです。
537     TEVOPRGB_INV_ALPHA,
538     //! RRRモードです。
539     TEVOPRGB_RRR,
540     //! INV_RRRモードです。
541     TEVOPRGB_INV_RRR,
542     //! GGGモードです。
543     TEVOPRGB_GGG,
544     //! INV_GGGモードです。
545     TEVOPRGB_INV_GGG,
546     //! BBBモードです。
547     TEVOPRGB_BBB,
548     //! INV_BBBモードです。
549     TEVOPRGB_INV_BBB,
550 
551     //! 列挙子の総数です。
552     TEVOPRGB_MAX
553 };
554 
555 //---------------------------------------------------------------------------
556 //! @brief Tevの入力のアルファのオペランドを指定する列挙子です。
557 //!
558 //! @since 2009/09/18 初版。
559 //---------------------------------------------------------------------------
560 enum TevOpAlp
561 {
562     //! ALPHAモードです。
563     TEVOPALP_ALPHA,
564     //! INV_ALPHAモードです。
565     TEVOPALP_INV_ALPHA,
566     //! Rモードです。
567     TEVOPALP_R,
568     //! INV_Rモードです。
569     TEVOPALP_INV_R,
570     //! Gモードです。
571     TEVOPALP_G,
572     //! INV_Gモードです。
573     TEVOPALP_INV_G,
574     //! Bモードです。
575     TEVOPALP_B,
576     //! INV_Bモードです。
577     TEVOPALP_INV_B,
578 
579     //! 列挙子の総数です。
580     TEVOPALP_MAX
581 };
582 
583 //---------------------------------------------------------------------------
584 //! @brief Tev出力のスケールを指定する列挙子です。
585 //!
586 //! @since 2009/09/18 初版。
587 //---------------------------------------------------------------------------
588 enum TevScale
589 {
590     //! 演算結果をそのまま出力します。
591     TEVSCALE_1,
592     //! 演算結果を 2 倍にします。
593     TEVSCALE_2,
594     //! 演算結果を 4 倍にします。
595     TEVSCALE_4,
596 
597     //! 列挙子の総数です。
598     TEVSCALE_MAX
599 };
600 
601 //---------------------------------------------------------------------------
602 //! @brief Tevの定数カラーレジスタにロードするカラーを指定する列挙子です。
603 //!
604 //! @since 2009/09/18 初版。
605 //---------------------------------------------------------------------------
606 enum TevKonstSel
607 {
608     //! コンバイナバッファ用カラーをロードします。
609     TEVKONSTSEL_BUFFER,
610     //! コンスタントレジスタ 0 をロードします。
611     TEVKONSTSEL_K0,
612     //! コンスタントレジスタ 1 をロードします。
613     TEVKONSTSEL_K1,
614     //! コンスタントレジスタ 2 をロードします。
615     TEVKONSTSEL_K2,
616     //! コンスタントレジスタ 3 をロードします。
617     TEVKONSTSEL_K3,
618     //! コンスタントレジスタ 4 をロードします。
619     TEVKONSTSEL_K4,
620     //! コンスタントレジスタ 5 をロードします。
621     TEVKONSTSEL_K5,
622 
623     //! 列挙子の総数です。
624     TEVKONSTSEL_MAX
625 };
626 
627 //---------------------------------------------------------------------------
628 //! @brief アルファテストのモードを指定する列挙子です。
629 //!
630 //! @since 2009/09/18 初版。
631 //---------------------------------------------------------------------------
632 enum AlphaTest
633 {
634     //! フラグメントは常に受け入れません。
635     ALPHATEST_NEVER,
636     //! フラグメント・アルファ<参照アルファのとき受け入れます。
637     ALPHATEST_LESS,
638     //! フラグメント・アルファ≦参照アルファのとき受け入れます。
639     ALPHATEST_LEQUAL,
640     //! フラグメント・アルファ=参照アルファのとき受け入れます。
641     ALPHATEST_EQUAL,
642     //! フラグメント・アルファ≠参照アルファのとき受け入れます。
643     ALPHATEST_NEQUAL,
644     //! フラグメント・アルファ≧参照アルファのとき受け入れます。
645     ALPHATEST_GEQUAL,
646     //! フラグメント・アルファ>参照アルファのとき受け入れます。
647     ALPHATEST_GREATER,
648     //! フラグメントは無条件に受け入れます。
649     ALPHATEST_ALWAYS,
650 
651     //! 列挙子の総数です。
652     ALPHATEST_MAX
653 };
654 
655 //---------------------------------------------------------------------------
656 //! @brief ブレンド処理のソースへの係数です。
657 //!
658 //! @since 2009/09/18 初版。
659 //---------------------------------------------------------------------------
660 enum BlendFactorSrc
661 {
662     //! (0.0) です。
663     BLENDFACTORSRC_0,
664     //! (1.0) です。
665     BLENDFACTORSRC_1,
666     //! (ターゲット・カラー) です。
667     BLENDFACTORSRC_DST_COLOR,
668     //! (1.0 - ターゲット・カラー) です。
669     BLENDFACTORSRC_INV_DST_COLOR,
670     //! (ソース・アルファ) です。
671     BLENDFACTORSRC_SRC_ALPHA,
672     //! (1.0 - ソース・アルファ) です。
673     BLENDFACTORSRC_INV_SRC_ALPHA,
674     //! (ターゲット・アルファ) です。
675     BLENDFACTORSRC_DST_ALPHA,
676     //! (1.0 - ターゲットアルファ) です。
677     BLENDFACTORSRC_INV_DST_ALPHA,
678 
679     //! 列挙子の総数です。
680     BLENDFACTORSRC_MAX
681 };
682 
683 //---------------------------------------------------------------------------
684 //! @brief ブレンド処理のターゲットへの係数です。
685 //!
686 //! @since 2009/09/18 初版。
687 //---------------------------------------------------------------------------
688 enum BlendFactorDst
689 {
690     //! (0.0) です。
691     BLENDFACTORDST_0,
692     //! (1.0) です。
693     BLENDFACTORDST_1,
694     //! (ソース・カラー) です。
695     BLENDFACTORDST_SRC_COLOR,
696     //! (1.0 - ソース・カラー) です。
697     BLENDFACTORDST_INV_SRC_COLOR,
698     //! (ソース・アルファ) です。
699     BLENDFACTORDST_SRC_ALPHA,
700     //! (1.0 - ソース・アルファ) です。
701     BLENDFACTORDST_INV_SRC_ALPHA,
702     //! (ターゲット・アルファ) です。
703     BLENDFACTORDST_DST_ALPHA,
704     //! (1.0 - ターゲット・アルファ) です。
705     BLENDFACTORDST_INV_DST_ALPHA,
706 
707     //! 列挙子の総数です。
708     BLENDFACTORDST_MAX
709 };
710 
711 //---------------------------------------------------------------------------
712 //! @brief ブレンドの演算方法を指定します。
713 //!
714 //! @since 2009/09/18 初版。
715 //---------------------------------------------------------------------------
716 enum BlendOp
717 {
718     //! ブレンド処理は行いません。
719     BLENDOP_DISABLE,
720     //! 加算します。
721     BLENDOP_ADD,
722     //! 減算します。
723     BLENDOP_SUBTRACT,
724     //! 逆方向に減算します。
725     BLENDOP_REVERSE_SUBTRACT,
726 
727     //! 列挙子の総数です。
728     BLENDOP_MAX
729 };
730 
731 //---------------------------------------------------------------------------
732 //! @brief 論理演算の演算方法を指定します。
733 //!
734 //! @since 2009/09/18 初版。
735 //---------------------------------------------------------------------------
736 enum LogicOp
737 {
738     //! 論理演算は行いません。
739     LOGICOP_DISABLE,
740     //! 何もしません。
741     LOGICOP_NOOP,
742     //! 0x00 です。
743     LOGICOP_CLEAR,
744     //! 0xff です。
745     LOGICOP_SET,
746     //! (ソース) です。
747     LOGICOP_COPY,
748     //! (~ソース) です。
749     LOGICOP_INV_COPY,
750     //! (~ターゲット) です。
751     LOGICOP_INV,
752     //! (ソース & ターゲット) です。
753     LOGICOP_AND,
754     //! ~(ソース & ターゲット) です。
755     LOGICOP_NAND,
756     //! (ソース | ターゲット です。
757     LOGICOP_OR,
758     //! ~(ソース | ターゲット) です。
759     LOGICOP_NOR,
760     //! (ソース ^ ターゲット です。
761     LOGICOP_XOR,
762     //! ~(ソース ^ ターゲット) です。
763     LOGICOP_EQUIV,
764     //! (ソース & ~ターゲット) です。
765     LOGICOP_REV_AND,
766     //! (~ソース & ターゲット) です。
767     LOGICOP_INV_AND,
768     //! (ソース | ~ターゲット) です。
769     LOGICOP_REV_OR,
770     //! (~ソース | ターゲット) です。
771     LOGICOP_INV_OR,
772 
773     //! 列挙子の総数です。
774     LOGICOP_MAX
775 };
776 
777 //---------------------------------------------------------------------------
778 //! @brief テクスチャ座標の生成方法を指定します。
779 //!
780 //! @since 2009/09/18 初版。
781 //---------------------------------------------------------------------------
782 enum TexGenType
783 {
784     //! 入力属性に関して 2X4 行列の乗算を行い、S, T テクスチャ座標を生成します。
785     TEXGENTYPE_MTX2x4,
786 
787     //! 列挙子の総数です。
788     TEXGENTYPE_MAX
789 };
790 
791 //---------------------------------------------------------------------------
792 //! @brief テクスチャ座標のソースを指定します。
793 //!
794 //! @since 2009/09/18 初版。
795 //---------------------------------------------------------------------------
796 enum TexGenSrc
797 {
798     //! テクスチャ座標 0 を使います。
799     TEXGENSRC_TEX0,
800     //! テクスチャ座標 1 を使います。
801     TEXGENSRC_TEX1,
802     //! テクスチャ座標 2 を使います。
803     TEXGENSRC_TEX2,
804 
805     //! 列挙子の総数です。
806     TEXGENSRC_MAX
807 };
808 
809 //---------------------------------------------------------------------------
810 //! @brief テクスチャの反転表示に関する列挙子です。
811 //!
812 //! @since 2009/09/18 初版。
813 //---------------------------------------------------------------------------
814 enum TextureFlip
815 {
816     //! そのまま表示します。
817     TEXTUREFLIP_NONE,
818     //! 左右(水平方向)に反転して表示します。
819     TEXTUREFLIP_FLIPH,
820     //! 上下(垂直方向)に反転して表示します。
821     TEXTUREFLIP_FLIPV,
822     //! 90度回転して表示します。
823     TEXTUREFLIP_ROTATE90,
824     //! 180度回転して表示します。
825     TEXTUREFLIP_ROTATE180,
826     //! 270度回転して表示します。
827     TEXTUREFLIP_ROTATE270,
828 
829     //! 列挙子の総数です。
830     TEXTUREFLIP_MAX
831 };
832 
833 //---------------------------------------------------------------------------
834 //! @brief 原点位置を指定します。
835 //!
836 //! @since 2009/09/18 初版。
837 //---------------------------------------------------------------------------
838 enum ScreenOriginType
839 {
840     //! レイアウトの左上隅を原点とします。
841     SCREENORIGINTYPE_CLASSIC,
842     //! レイアウトの中心を原点とします。
843     SCREENORIGINTYPE_NORMAL,
844 
845     //! 列挙子の総数です。
846     SCREENORIGINTYPE_MAX
847 };
848 
849 //---------------------------------------------------------------------------
850 //! @brief TextBox の行そろえ指定です。
851 //!
852 //! @since 2009/09/18 初版。
853 //---------------------------------------------------------------------------
854 enum TextAlignment
855 {
856     //! 水平方向の位置にあわせます。
857     TEXTALIGNMENT_SYNCHRONOUS,
858     //! 左にそろえます。
859     TEXTALIGNMENT_LEFT,
860     //! 中央にそろえます。
861     TEXTALIGNMENT_CENTER,
862     //! 右にそろえます。
863     TEXTALIGNMENT_RIGHT,
864 
865     //! 列挙子の総数です。
866     TEXTALIGNMENT_MAX
867 };
868 
869 //---------------------------------------------------------------------------
870 //! @brief 頂点属性番号です。
871 //!
872 //! @since 2009/09/18 初版。
873 //---------------------------------------------------------------------------
874 enum VertexAttr
875 {
876     //! 頂点座標です。
877     VERTEXATTR_POS,
878     //! 頂点カラーです。
879     VERTEXATTR_COLOR,
880     //! テクスチャ座標 0 です。
881     VERTEXATTR_TEXCOORD0,
882     //! テクスチャ座標 1 です。
883     VERTEXATTR_TEXCOORD1,
884     //! テクスチャ座標 2 です。
885     VERTEXATTR_TEXCOORD2,
886 
887     //! 頂点インデックスです。
888     VERTEXATTR_VERTEX_INDEX = 0,
889 
890     //! 列挙子の総数です。
891     VERTEXATTR_MAX
892 };
893 
894 //---------------------------------------------------------------------------
895 //! @brief 頂点属性に要求されるサイズです。
896 //!
897 //! @since 2009/09/18 初版。
898 //---------------------------------------------------------------------------
899 enum VertexAttrSize
900 {
901     //! 頂点座標に要求されるサイズです。
902     VERTEXATTRSIZE_POS = 4,
903     //! 頂点カラーに要求されるサイズです。
904     VERTEXATTRSIZE_COLOR = 4,
905     //! テクスチャ座標に要求されるサイズです。
906     VERTEXATTRSIZE_TEXCOORD = 2,
907     //! 頂点インデックスに要求されるサイズです。
908     VERTEXATTRSIZE_INDEX = 2
909 };
910 
911 using nw::font::Vertex;
912 using nw::font::VERTEX_LT;
913 using nw::font::VERTEX_RT;
914 using nw::font::VERTEX_LB;
915 using nw::font::VERTEX_RB;
916 using nw::font::VERTEX_MAX;
917 
918 //---------------------------------------------------------------------------
919 //! @brief ペインの四隅に設定された頂点カラーにアクセスするときに使用します。
920 //!
921 //! @since 2009/09/18 初版。
922 //---------------------------------------------------------------------------
923 enum VertexColor
924 {
925     //! 左上隅の頂点カラーです。
926     VERTEXCOLOR_LT,
927     //! 右上隅の頂点カラーです。
928     VERTEXCOLOR_RT,
929     //! 左下隅の頂点カラーです。
930     VERTEXCOLOR_LB,
931     //! 右下隅の頂点カラーです。
932     VERTEXCOLOR_RB,
933 
934     //! 列挙子の総数です。
935     VERTEXCOLOR_MAX
936 };
937 
938 //---------------------------------------------------------------------------
939 //! @brief ウィンドウフレームを指定するときに使用します。
940 //!
941 //! @since 2009/09/18 初版。
942 //---------------------------------------------------------------------------
943 enum WindowFrame
944 {
945     //! 左上フレームです。
946     WINDOWFRAME_LT,
947     //! 右上フレームです。
948     WINDOWFRAME_RT,
949     //! 左下フレームです。
950     WINDOWFRAME_LB,
951     //! 右下フレームです。
952     WINDOWFRAME_RB,
953     //! 左フレームです。
954     WINDOWFRAME_L,
955     //! 右フレームです。
956     WINDOWFRAME_R,
957     //! 上フレームです。
958     WINDOWFRAME_T,
959     //! 下フレームです。
960     WINDOWFRAME_B,
961 
962     //! 列挙子の総数です。
963     WINDOWFRAME_MAX
964 };
965 
966 //---------------------------------------------------------------------------
967 //! @brief 文字色の設定にアクセスするときに使用します。
968 //!
969 //! @since 2009/09/18 初版。
970 //---------------------------------------------------------------------------
971 enum TextColor
972 {
973     //! 上端の文字色です。
974     TEXTCOLOR_TOP,
975     //! 下端の文字色です。
976     TEXTCOLOR_BOTTOM,
977 
978     //! 列挙子の総数です。
979     TEXTCOLOR_MAX
980 };
981 
982 //---------------------------------------------------------------------------
983 //! @brief 文字色の設定にアクセスするときに使用します。
984 //!
985 //! @since 2009/09/18 初版。
986 //---------------------------------------------------------------------------
987 enum InterpolateColor
988 {
989     //! 黒カラー補間色です。
990     INTERPOLATECOLOR_BLACK = 0,
991     //! 白カラー補間色です。
992     INTERPOLATECOLOR_WHITE = 1,
993 
994     //! 列挙子の総数です。
995     INTERPOLATECOLOR_MAX
996 };
997 
998 //@}
999 
1000 //! @name リソースアクセサ
1001 //@{
1002 
1003 //---------------------------------------------------------------------------
1004 //! @brief 拡張ユーザデータのデータ種別です。
1005 //!
1006 //! @since 2009/09/18 初版。
1007 //---------------------------------------------------------------------------
1008 enum ExtUserDataType
1009 {
1010     //! 文字列です。
1011     EXTUSERDATATYPE_STRING,
1012     //! 整数配列です。
1013     EXTUSERDATATYPE_INT,
1014     //! 浮動小数点数配列です。
1015     EXTUSERDATATYPE_FLOAT,
1016 
1017     //! 列挙子の総数です。
1018     EXTUSERDATATYPE_MAX
1019 };
1020 
1021 //@}
1022 
1023 //! @name アニメーション
1024 //@{
1025 
1026 //---------------------------------------------------------------------------
1027 //! @brief アニメーションの対象を表します。
1028 //!
1029 //! @sa res::AnimationContent
1030 //!
1031 //! @since 2009/09/18 初版。
1032 //---------------------------------------------------------------------------
1033 enum AnimContentType
1034 {
1035     //! ペインを対象としたアニメーションです。
1036     ANIMCONTENTTYPE_PANE,
1037     //! マテリアルを対象としたアニメーションです。
1038     ANIMCONTENTTYPE_MATERIAL,
1039 
1040     //! 列挙子の総数です。
1041     ANIMCONTENTTYPE_MAX
1042 };
1043 
1044 //---------------------------------------------------------------------------
1045 //! @brief アニメーションタグのフラグです。
1046 //!
1047 //! @since 2009/09/18 初版。
1048 //---------------------------------------------------------------------------
1049 enum AnimTagFlag
1050 {
1051     //! ペインの子孫ペインもバインドの対象にします。
1052     ANIMTAGFLAG_DESCENDINGBIND,
1053 
1054     //! 列挙子の総数です。
1055     ANIMTAGFLAG_MAX
1056 };
1057 
1058 //---------------------------------------------------------------------------
1059 //! @brief ペインアニメーションの対象を指定します。
1060 //!
1061 //! @since 2009/09/18 初版。
1062 //---------------------------------------------------------------------------
1063 enum AnimTargetPane
1064 {
1065     //! 表示位置の X 座標です。
1066     ANIMTARGET_PANE_TRANSLATEX = 0,
1067     //! 表示位置の Y 座標です。
1068     ANIMTARGET_PANE_TRANSLATEY,
1069     //! 表示位置の Z 座標です。
1070     ANIMTARGET_PANE_TRANSLATEZ,
1071     //! X 軸の回転量です。
1072     ANIMTARGET_PANE_ROTATEX,
1073     //! Y 軸の回転量です。
1074     ANIMTARGET_PANE_ROTATEY,
1075     //! Z 軸の回転量です。
1076     ANIMTARGET_PANE_ROTATEZ,
1077     //! X 座標方向の拡大率です。
1078     ANIMTARGET_PANE_SCALEX,
1079     //! Y 座標方向の拡大率です。
1080     ANIMTARGET_PANE_SCALEY,
1081     //! 幅です。
1082     ANIMTARGET_PANE_SIZEW,
1083     //! 高さです。
1084     ANIMTARGET_PANE_SIZEH,
1085 
1086     //! 列挙子の総数です。
1087     ANIMTARGET_PANE_MAX
1088 };
1089 
1090 //---------------------------------------------------------------------------
1091 //! @brief ビジビリティアニメーションの対象を指定します。
1092 //!
1093 //! @since 2009/09/18 初版。
1094 //---------------------------------------------------------------------------
1095 enum AnimTargetVisibility
1096 {
1097     //! ビジビリティです。
1098     ANIMTARGET_VISIBILITY_VISIBILITY = 0,
1099 
1100     //! 列挙子の総数です。
1101     ANIMTARGET_VISIBILITY_MAX
1102 };
1103 
1104 //---------------------------------------------------------------------------
1105 //! @brief ペインカラーアニメーションの対象を指定します。
1106 //!
1107 //! @since 2009/09/18 初版。
1108 //---------------------------------------------------------------------------
1109 enum AnimTargetPaneColor
1110 {
1111     //! 左上隅の頂点カラーの R 成分値です。
1112     ANIMTARGET_VERTEXCOLOR_LT_R = 0,
1113     //! 左上隅の頂点カラーの G 成分値です。
1114     ANIMTARGET_VERTEXCOLOR_LT_G,
1115     //! 左上隅の頂点カラーの B 成分値です。
1116     ANIMTARGET_VERTEXCOLOR_LT_B,
1117     //! 左上隅の頂点カラーの A 成分値です。
1118     ANIMTARGET_VERTEXCOLOR_LT_A,
1119     //! 右上隅の頂点カラーの R 成分値です。
1120     ANIMTARGET_VERTEXCOLOR_RT_R,
1121     //! 右上隅の頂点カラーの G 成分値です。
1122     ANIMTARGET_VERTEXCOLOR_RT_G,
1123     //! 右上隅の頂点カラーの B 成分値です。
1124     ANIMTARGET_VERTEXCOLOR_RT_B,
1125     //! 右上隅の頂点カラーの A 成分値です。
1126     ANIMTARGET_VERTEXCOLOR_RT_A,
1127     //! 左下隅の頂点カラーの R 成分値です。
1128     ANIMTARGET_VERTEXCOLOR_LB_R,
1129     //! 左下隅の頂点カラーの G 成分値です。
1130     ANIMTARGET_VERTEXCOLOR_LB_G,
1131     //! 左下隅の頂点カラーの B 成分値です。
1132     ANIMTARGET_VERTEXCOLOR_LB_B,
1133     //! 左下隅の頂点カラーの A 成分値です。
1134     ANIMTARGET_VERTEXCOLOR_LB_A,
1135     //! 右下隅の頂点カラーの R 成分値です。
1136     ANIMTARGET_VERTEXCOLOR_RB_R,
1137     //! 右下隅の頂点カラーの G 成分値です。
1138     ANIMTARGET_VERTEXCOLOR_RB_G,
1139     //! 右下隅の頂点カラーの B 成分値です。
1140     ANIMTARGET_VERTEXCOLOR_RB_B,
1141     //! 右下隅の頂点カラーの A 成分値です。
1142     ANIMTARGET_VERTEXCOLOR_RB_A,
1143 
1144     //! 列挙子の総数です。
1145     ANIMTARGET_VERTEXCOLOR_MAX,
1146 
1147     //! ペインのアルファ値です。
1148     ANIMTARGET_PANE_ALPHA = ANIMTARGET_VERTEXCOLOR_MAX,
1149 
1150     //! 列挙子の総数です。
1151     ANIMTARGET_PANE_COLOR_MAX
1152 };
1153 
1154 //---------------------------------------------------------------------------
1155 //! @brief マテリアルカラーアニメーションの対象を指定します。
1156 //!
1157 //! @since 2009/09/18 初版。
1158 //---------------------------------------------------------------------------
1159 enum AnimTargetMatColor
1160 {
1161     //! コンバイナバッファの R 成分です。
1162     ANIMTARGET_MATCOLOR_BUFFER_R = 0,
1163     //! コンバイナバッファの R 成分です。
1164     ANIMTARGET_MATCOLOR_BUFFER_G,
1165     //! コンバイナバッファの R 成分です。
1166     ANIMTARGET_MATCOLOR_BUFFER_B,
1167     //! コンバイナバッファの R 成分です。
1168     ANIMTARGET_MATCOLOR_BUFFER_A,
1169     //! コンスタントレジスタ 0 の R 成分です。
1170     ANIMTARGET_MATCOLOR_KONST0_R,
1171     //! コンスタントレジスタ 0 の G 成分です。
1172     ANIMTARGET_MATCOLOR_KONST0_G,
1173     //! コンスタントレジスタ 0 の B 成分です。
1174     ANIMTARGET_MATCOLOR_KONST0_B,
1175     //! コンスタントレジスタ 0 の A 成分です。
1176     ANIMTARGET_MATCOLOR_KONST0_A,
1177     //! コンスタントレジスタ 1 の R 成分です。
1178     ANIMTARGET_MATCOLOR_KONST1_R,
1179     //! コンスタントレジスタ 1 の G 成分です。
1180     ANIMTARGET_MATCOLOR_KONST1_G,
1181     //! コンスタントレジスタ 1 の B 成分です。
1182     ANIMTARGET_MATCOLOR_KONST1_B,
1183     //! コンスタントレジスタ 1 の A 成分です。
1184     ANIMTARGET_MATCOLOR_KONST1_A,
1185     //! コンスタントレジスタ 2 の R 成分です。
1186     ANIMTARGET_MATCOLOR_KONST2_R,
1187     //! コンスタントレジスタ 2 の G 成分です。
1188     ANIMTARGET_MATCOLOR_KONST2_G,
1189     //! コンスタントレジスタ 2 の B 成分です。
1190     ANIMTARGET_MATCOLOR_KONST2_B,
1191     //! コンスタントレジスタ 2 の A 成分です。
1192     ANIMTARGET_MATCOLOR_KONST2_A,
1193     //! コンスタントレジスタ 3 の R 成分です。
1194     ANIMTARGET_MATCOLOR_KONST3_R,
1195     //! コンスタントレジスタ 3 の G 成分です。
1196     ANIMTARGET_MATCOLOR_KONST3_G,
1197     //! コンスタントレジスタ 3 の B 成分です。
1198     ANIMTARGET_MATCOLOR_KONST3_B,
1199     //! コンスタントレジスタ 3 の A 成分です。
1200     ANIMTARGET_MATCOLOR_KONST3_A,
1201     //! コンスタントレジスタ 4 の R 成分です。
1202     ANIMTARGET_MATCOLOR_KONST4_R,
1203     //! コンスタントレジスタ 4 の G 成分です。
1204     ANIMTARGET_MATCOLOR_KONST4_G,
1205     //! コンスタントレジスタ 4 の B 成分です。
1206     ANIMTARGET_MATCOLOR_KONST4_B,
1207     //! コンスタントレジスタ 4 の A 成分です。
1208     ANIMTARGET_MATCOLOR_KONST4_A,
1209     //! コンスタントレジスタ 5 の R 成分です。
1210     ANIMTARGET_MATCOLOR_KONST5_R,
1211     //! コンスタントレジスタ 5 の G 成分です。
1212     ANIMTARGET_MATCOLOR_KONST5_G,
1213     //! コンスタントレジスタ 5 の B 成分です。
1214     ANIMTARGET_MATCOLOR_KONST5_B,
1215     //! コンスタントレジスタ 5 の A 成分です。
1216     ANIMTARGET_MATCOLOR_KONST5_A,
1217 
1218     //! 列挙子の総数です。
1219     ANIMTARGET_MATCOLOR_MAX
1220 };
1221 
1222 //---------------------------------------------------------------------------
1223 //! @brief テクスチャ SRT アニメーションの対象を指定します。
1224 //!
1225 //! @since 2009/09/18 初版。
1226 //---------------------------------------------------------------------------
1227 enum AnimTargetTexSRT
1228 {
1229     //! S 座標の移動量です。
1230     ANIMTARGET_TEXSRT_TRANSLATES = 0,
1231     //! T 座標の移動量です。
1232     ANIMTARGET_TEXSRT_TRANSLATET,
1233     //! 回転量です。
1234     ANIMTARGET_TEXSRT_ROTATE,
1235     //! S 座標方向の拡大率です。
1236     ANIMTARGET_TEXSRT_SCALES,
1237     //! T 座標方向の拡大率です。
1238     ANIMTARGET_TEXSRT_SCALET,
1239 
1240     //! 列挙子の総数です。
1241     ANIMTARGET_TEXSRT_MAX
1242 };
1243 
1244 //---------------------------------------------------------------------------
1245 //! @brief テクスチャパターンアニメーションの対象を指定します。
1246 //!
1247 //! @since 2009/09/18 初版。
1248 //---------------------------------------------------------------------------
1249 enum AnimTargetTexPattern
1250 {
1251     //! イメージによるアニメーションです。
1252     ANIMTARGET_TEXPATTURN_IMAGE = 0,
1253 
1254     //! 列挙子の総数です。
1255     ANIMTARGET_TEXPATTURN_MAX
1256 };
1257 
1258 //---------------------------------------------------------------------------
1259 //! @brief アニメーションの計算形式です。
1260 //!
1261 //! @since 2009/09/18 初版。
1262 //---------------------------------------------------------------------------
1263 enum AnimCurve
1264 {
1265     //! コンスタント形式です。
1266     ANIMCURVE_CONSTANT,
1267     //! ステップ形式です。
1268     ANIMCURVE_STEP,
1269     //! エルミート補間形式です。
1270     ANIMCURVE_HERMITE,
1271 
1272     //! 列挙子の総数です。
1273     ANIMCURVE_MAX
1274 };
1275 
1276 //---------------------------------------------------------------------------
1277 //! @brief アニメーションの計算を制御するオプションです。
1278 //!
1279 //! @sa Layout::Animate
1280 //! @sa Pane::Animate
1281 //!
1282 //! @since 2009/09/18 初版。
1283 //---------------------------------------------------------------------------
1284 enum AnimateOpt
1285 {
1286     ANIMATEOPT_NOANIMATEINVISIBLE   = 0x0001 //!< 非表示のペインの計算を省略します。
1287 };
1288 
1289 //@}
1290 
1291 namespace res
1292 {
1293 
1294 //---------------------------------------------------------------------------
1295 //! @brief リソース内で2次元ベクトルを保持します。
1296 //!
1297 //! @since 2009/09/18 初版。
1298 //---------------------------------------------------------------------------
1299 struct Vec2
1300 {
1301     //----------------------------------------
1302     //! @name コンストラクタ/デストラクタ
1303     //@{
1304 
1305     //! @brief コンストラクタです。
1306     //!
1307     //! @since 2009/09/18 初版。
1308     //!
Vec2Vec21309     Vec2()
1310     {
1311     }
1312 
1313     //! @brief コンストラクタです。
1314     //!
1315     //! @param x X座標の値です。
1316     //! @param y Y座標の値です。
1317     //!
1318     //! @since 2009/09/18 初版。
1319     //!
Vec2Vec21320     Vec2(f32 x, f32 y)
1321     {
1322         this->x = x;
1323         this->y = y;
1324     }
1325 
1326     //@}
1327 
1328     //! @brief 変換オペレータです。
1329     //!
1330     //! @since 2009/09/18 初版。
1331     //!
VEC2Vec21332     operator const math::VEC2() const
1333     {
1334         return math::VEC2(x, y);
1335     }
1336 
1337     //! X座標の値です。
1338     ut::ResF32 x;
1339     //! Y座標の値です。
1340     ut::ResF32 y;
1341 };
1342 
1343 //---------------------------------------------------------------------------
1344 //! @brief リソース内で3次元ベクトルを保持します。
1345 //!
1346 //! @since 2009/09/18 初版。
1347 //---------------------------------------------------------------------------
1348 struct Vec3
1349 {
1350     //----------------------------------------
1351     //! @name コンストラクタ/デストラクタ
1352     //@{
1353 
1354     //! @brief コンストラクタです。
1355     //!
1356     //! @since 2009/09/18 初版。
1357     //!
Vec3Vec31358     Vec3()
1359     {
1360     }
1361 
1362     //! @brief コンストラクタです。
1363     //!
1364     //! @param x X座標の値です。
1365     //! @param y Y座標の値です。
1366     //! @param z Z座標の値です。
1367     //!
1368     //! @since 2009/09/18 初版。
1369     //!
Vec3Vec31370     Vec3(f32 x, f32 y, f32 z)
1371     {
1372         this->x = x;
1373         this->y = y;
1374         this->z = z;
1375     }
1376 
1377     //@}
1378 
1379     //! @brief 変換オペレータです。
1380     //!
1381     //! @since 2009/09/18 初版。
1382     //!
VEC3Vec31383     operator const math::VEC3() const
1384     {
1385         return math::VEC3(x, y, z);
1386     }
1387 
1388     //! X座標の値です。
1389     ut::ResF32 x;
1390 
1391     //! Y座標の値です。
1392     ut::ResF32 y;
1393 
1394     //! Z座標の値です。
1395     ut::ResF32 z;
1396 };
1397 
1398 } // namespace nw::lyt::res
1399 
1400 //---------------------------------------------------------------------------
1401 //! :category 描画
1402 //!
1403 //! @brief 幅と高さを持つ構造体です。
1404 //!
1405 //! @since 2009/09/18 初版。
1406 //---------------------------------------------------------------------------
1407 struct Size
1408 {
1409     //----------------------------------------
1410     //! @name コンストラクタ/デストラクタ
1411     //@{
1412 
1413     //! @brief コンストラクタです。
1414     //!
1415     //! @details
1416     //! 幅と高さを 0 に初期化します。
1417     //!
1418     //! @since 2009/09/18 初版。
1419     //!
SizeSize1420     Size()
1421         : width(0), height(0)
1422     {}
1423 
1424     //! @brief コンストラクタです。
1425     //!
1426     //! @details
1427     //! 指定の幅と高さで初期化します。
1428     //!
1429     //! @param aWidth 幅です。
1430     //! @param aHeight 高さです。
1431     //!
1432     //! @since 2009/09/18 初版。
1433     //!
SizeSize1434     Size(f32 aWidth, f32 aHeight)
1435         : width(aWidth), height(aHeight)
1436     {}
1437 
1438     //! @brief コンストラクタです。
1439     //!
1440     //! @details
1441     //! 設定をコピーします。
1442     //!
1443     //! @param other コピー元です。
1444     //!
1445     //! @since 2009/09/18 初版。
1446     //!
SizeSize1447     Size(const Size& other)
1448         : width(other.width), height(other.height)
1449     {}
1450 
1451     //@}
1452 
1453     //! 幅です。
1454     ut::ResF32 width;
1455 
1456     //! 高さです。
1457     ut::ResF32 height;
1458 };
1459 
1460 //---------------------------------------------------------------------------
1461 //! @brief 二つの Size が等しいかどうかを判定します。
1462 //!
1463 //! @param a 比較する Size 構造体のリファレンスです。
1464 //! @param b 比較する Size 構造体のリファレンスです。
1465 //!
1466 //! @return
1467 //! 幅と高さが等しければ true を、等しくなければ false を返します。
1468 //!
1469 //! @since 2009/09/18 初版。
1470 //---------------------------------------------------------------------------
1471 inline bool
1472 operator == (const Size& a, const Size& b)
1473 {
1474     return a.width == b.width && a.height == b.height;
1475 }
1476 
1477 //---------------------------------------------------------------------------
1478 //! :category 描画
1479 //!
1480 //! @brief テクスチャの幅と高さを持つ構造体です。
1481 //!
1482 //! @since 2009/09/18 初版。
1483 //---------------------------------------------------------------------------
1484 struct TexSize
1485 {
1486     //----------------------------------------
1487     //! @name コンストラクタ/デストラクタ
1488     //@{
1489 
1490     //! @brief コンストラクタです。
1491     //!
1492     //! @details
1493     //! 幅と高さを 0 で初期化します。
1494     //!
1495     //! @since 2009/09/18 初版。
1496     //!
TexSizeTexSize1497     TexSize()
1498         : width(0), height(0)
1499     {}
1500 
1501     //! @brief コンストラクタです。
1502     //!
1503     //! @details
1504     //! 指定の幅と高さで初期化します。
1505     //!
1506     //! @param aWidth 幅です。
1507     //! @param aHeight 高さです。
1508     //!
1509     //! @since 2009/09/18 初版。
1510     //!
TexSizeTexSize1511     TexSize(u16 aWidth, u16 aHeight)
1512         : width(aWidth), height(aHeight)
1513     {}
1514 
1515     //! @brief コピーコンストラクタです。
1516     //!
1517     //! @param other コピー元です。
1518     //!
1519     //! @since 2009/09/18 初版。
1520     //!
TexSizeTexSize1521     TexSize(const TexSize& other)
1522         : width(other.width), height(other.height)
1523     {}
1524 
1525     //! @brief Size への変換演算子です。
1526     //!
1527     //! @return Size を返します。
1528     //!
1529     //! @since 2010/02/26 初版。
1530     //!
SizeTexSize1531     operator const Size() const
1532     {
1533         return Size(this->width, this->height);
1534     }
1535 
1536     //@}
1537 
1538     //! 幅です。
1539     u16 width;
1540 
1541     //! 高さです。
1542     u16 height;
1543 };
1544 
1545 //---------------------------------------------------------------------------
1546 //! :category 描画
1547 //!
1548 //! @brief テクスチャ SRT 変換行列の構造体です。
1549 //!
1550 //! @since 2009/09/18 初版。
1551 //---------------------------------------------------------------------------
1552 struct TexSRT
1553 {
1554     //! 平行移動です。
1555     res::Vec2 translate;
1556     //! 回転です。
1557     ut::ResF32 rotate;
1558     //! 拡大率です。
1559     res::Vec2 scale;
1560 };
1561 
1562 //---------------------------------------------------------------------------
1563 //! :category 描画
1564 //!
1565 //! @brief テクスチャ座標生成に設定する値を持つ構造体です。
1566 //!
1567 //! @since 2009/09/18 初版。
1568 //---------------------------------------------------------------------------
1569 struct TexCoordGen
1570 {
1571     //----------------------------------------
1572     //! @name コンストラクタ/デストラクタ
1573     //@{
1574 
1575     //! @brief コンストラクタです。
1576     //!
1577     //! @since 2009/09/18 初版。
1578     //!
TexCoordGenTexCoordGen1579     TexCoordGen()
1580     {
1581         Set(TEXGENTYPE_MTX2x4, TEXGENSRC_TEX0);
1582     }
1583 
1584     //! @brief コンストラクタです。
1585     //!
1586     //! @param aTexGenType テクスチャ座標の生成方法です。
1587     //! @param aTexGenSrc テクスチャ座標のソースです。
1588     //!
1589     //! @since 2009/09/18 初版。
1590     //!
TexCoordGenTexCoordGen1591     TexCoordGen(
1592         TexGenType      aTexGenType,
1593         TexGenSrc       aTexGenSrc
1594     )
1595     {
1596         Set(aTexGenType, aTexGenSrc);
1597     }
1598 
1599     //@}
1600 
1601     //----------------------------------------
1602     //! @name 取得/設定
1603     //@{
1604 
1605     //! @brief テクスチャ座標生成の設定を変更します。
1606     //!
1607     //! @param aTexGenType テクスチャ座標の生成方法です。
1608     //! @param aTexGenSrc テクスチャ座標のソースです。
1609     //!
1610     //! @since 2009/09/18 初版。
1611     //!
SetTexCoordGen1612     void Set(
1613         TexGenType    aTexGenType,
1614         TexGenSrc     aTexGenSrc
1615                         )
1616     {
1617         texGenType = aTexGenType;
1618         texGenSrc = aTexGenSrc;
1619     }
1620 
1621     //! @brief テクスチャ座標の生成方法を取得します。
1622     //!
1623     //! @return テクスチャ座標の生成方法を返します。
1624     //!
1625     //! @since 2009/09/18 初版。
1626     //!
GetTexGenTypeTexCoordGen1627     TexGenType GetTexGenType() const
1628     {
1629         return TexGenType(texGenType);
1630     }
1631 
1632     //! @brief テクスチャ座標のソースを取得します。
1633     //!
1634     //! @return テクスチャ座標のソースを返します。
1635     //!
1636     //! @since 2009/09/18 初版。
1637     //!
GetTexGenSrcTexCoordGen1638     TexGenSrc GetTexGenSrc() const
1639     {
1640         return TexGenSrc(texGenSrc);
1641     }
1642 
1643     //@}
1644 
1645 protected:
1646     //! @details :private
1647     //! テクスチャ座標生成のタイプです。
1648     ut::ResU8 texGenType;
1649 
1650     //! @details :private
1651     //! テクスチャ座標生成に使用するソースです。
1652     ut::ResU8 texGenSrc;
1653 
1654     //! @details :private
1655     //! (未使用)
1656     ut::ResU8 reserve[2];
1657 };
1658 
1659 //---------------------------------------------------------------------------
1660 //! :category 描画
1661 //!
1662 //! @brief TEV ステージの設定を持つ構造体です。
1663 //!
1664 //! @since 2009/09/18 初版。
1665 //---------------------------------------------------------------------------
1666 struct TevStage
1667 {
1668     //----------------------------------------
1669     //! @name コンストラクタ/デストラクタ
1670     //@{
1671 
1672     //! @brief コンストラクタです。
1673     //!
1674     //! @since 2009/09/18 初版。
1675     //!
TevStageTevStage1676     TevStage()
1677     {
1678         Set(
1679             TEVMODE_REPLACE,
1680             TEVMODE_REPLACE,
1681             TEVSRC_PRIMARY,
1682             TEVSRC_PRIMARY,
1683             TEVSRC_PRIMARY,
1684             TEVSRC_PRIMARY,
1685             TEVSRC_PRIMARY,
1686             TEVSRC_PRIMARY,
1687             TEVOPRGB_RGB,
1688             TEVOPRGB_RGB,
1689             TEVOPRGB_RGB,
1690             TEVOPALP_ALPHA,
1691             TEVOPALP_ALPHA,
1692             TEVOPALP_ALPHA,
1693             TEVSCALE_1,
1694             TEVSCALE_1,
1695             TEVKONSTSEL_K0,
1696             TEVKONSTSEL_K0,
1697             false,
1698             false);
1699     }
1700 
1701     //@}
1702 
1703     //----------------------------------------
1704     //! @name 取得/設定
1705     //@{
1706 
1707     //! @brief すべての項目を設定します。
1708     //!
1709     //! @param combineRgb RGBの演算のタイプです。
1710     //! @param combineAlpha アルファの演算のタイプです。
1711     //! @param srcRgb0 RGB演算のソース 0 です。
1712     //! @param srcRgb1 RGB演算のソース 1 です。
1713     //! @param srcRgb2 RGB演算のソース 2 です。
1714     //! @param srcAlpha0 アルファ演算のソース 0 です。
1715     //! @param srcAlpha1 アルファ演算のソース 1 です。
1716     //! @param srcAlpha2 アルファ演算のソース 2 です。
1717     //! @param operandRgb0 RGB演算のソース 0 のオペランドです。
1718     //! @param operandRgb1 RGB演算のソース 1 のオペランドです。
1719     //! @param operandRgb2 RGB演算のソース 2 のオペランドです。
1720     //! @param operandAlpha0 アルファ演算のソース 0 のオペランドです。
1721     //! @param operandAlpha1 アルファ演算のソース 1 のオペランドです。
1722     //! @param operandAlpha2 アルファ演算のソース 2 のオペランドです。
1723     //! @param scaleRgb RGB演算に対するスケールです。
1724     //! @param scaleAlpha アルファ演算に対するスケールです。
1725     //! @param konstSelRgb RGB演算で使用する定数レジスタのソースです。
1726     //! @param konstSelAlpha アルファ演算で使用する定数レジスタのソースです。
1727     //! @param savePrevRgb 前段の演算結果(RGB)をバッファに保存する場合は true を指定します。
1728     //! @param savePrevAlpha 前段の演算結果(A)をバッファに保存する場合は true を指定します。
1729     //!
1730     //! @since 2009/09/18 初版。
1731     //!
SetTevStage1732     void Set(
1733         TevMode         combineRgb,
1734         TevMode         combineAlpha,
1735         TevSrc          srcRgb0,
1736         TevSrc          srcRgb1,
1737         TevSrc          srcRgb2,
1738         TevSrc          srcAlpha0,
1739         TevSrc          srcAlpha1,
1740         TevSrc          srcAlpha2,
1741         TevOpRgb        operandRgb0,
1742         TevOpRgb        operandRgb1,
1743         TevOpRgb        operandRgb2,
1744         TevOpAlp        operandAlpha0,
1745         TevOpAlp        operandAlpha1,
1746         TevOpAlp        operandAlpha2,
1747         TevScale        scaleRgb,
1748         TevScale        scaleAlpha,
1749         TevKonstSel     konstSelRgb,
1750         TevKonstSel     konstSelAlpha,
1751         bool            savePrevRgb,
1752         bool            savePrevAlpha
1753     )
1754     {
1755         SetCombineRgb(combineRgb);
1756         SetCombineAlpha(combineAlpha);
1757         SetSrcRgb0(srcRgb0);
1758         SetSrcRgb1(srcRgb1);
1759         SetSrcRgb2(srcRgb2);
1760         SetSrcAlpha0(srcAlpha0);
1761         SetSrcAlpha1(srcAlpha1);
1762         SetSrcAlpha2(srcAlpha2);
1763         SetOperandRgb0(operandRgb0);
1764         SetOperandRgb1(operandRgb1);
1765         SetOperandRgb2(operandRgb2);
1766         SetOperandAlpha0(operandAlpha0);
1767         SetOperandAlpha1(operandAlpha1);
1768         SetOperandAlpha2(operandAlpha2);
1769         SetScaleRgb(scaleRgb);
1770         SetScaleAlpha(scaleAlpha);
1771         SetKonstSelRgb(konstSelRgb);
1772         SetKonstSelAlpha(konstSelAlpha);
1773         SetSavePrevRgb(savePrevRgb);
1774         SetSavePrevAlpha(savePrevAlpha);
1775     }
1776 
1777     //! @brief RGBの演算のタイプを設定します。
1778     //!
1779     //! @param value 設定する値です。
1780     //!
1781     //! @since 2009/09/18 初版。
1782     //!
SetCombineRgbTevStage1783     void SetCombineRgb(TevMode value)
1784     {
1785         NW_ASSERT(value < TEVMODE_MAX);
1786         bits0 = internal::SetBits(u32(bits0), POS0_COMBINERGB, BITS_COMBINERGB, u32(value));
1787     }
1788 
1789     //! @brief アルファの演算のタイプを設定します。
1790     //!
1791     //! @param value 設定する値です。
1792     //!
1793     //! @since 2009/09/18 初版。
1794     //!
SetCombineAlphaTevStage1795     void SetCombineAlpha(TevMode value)
1796     {
1797         NW_ASSERT(value < TEVMODE_MAX);
1798         bits1 = internal::SetBits(u32(bits1), POS1_COMBINEALPHA, BITS_COMBINEALPHA, u32(value));
1799     }
1800 
1801     //! @brief RGB演算のソース 0 を設定します。
1802     //!
1803     //! @param value 設定する値です。
1804     //!
1805     //! @since 2009/09/18 初版。
1806     //!
SetSrcRgb0TevStage1807     void SetSrcRgb0(TevSrc value)
1808     {
1809         NW_ASSERT(value < TEVSRC_MAX);
1810         bits0 = internal::SetBits(u32(bits0), POS0_SRCRGB0, BITS_SRCRGB, u32(value));
1811     }
1812 
1813     //! @brief RGB演算のソース 1 を設定します。
1814     //!
1815     //! @param value 設定する値です。
1816     //!
1817     //! @since 2009/09/18 初版。
1818     //!
SetSrcRgb1TevStage1819     void SetSrcRgb1(TevSrc value)
1820     {
1821         NW_ASSERT(value < TEVSRC_MAX);
1822         bits0 = internal::SetBits(u32(bits0), POS0_SRCRGB1, BITS_SRCRGB, u32(value));
1823     }
1824 
1825     //! @brief RGB演算のソース 2 を設定します。
1826     //!
1827     //! @param value 設定する値です。
1828     //!
1829     //! @since 2009/09/18 初版。
1830     //!
SetSrcRgb2TevStage1831     void SetSrcRgb2(TevSrc value)
1832     {
1833         NW_ASSERT(value < TEVSRC_MAX);
1834         bits0 = internal::SetBits(u32(bits0), POS0_SRCRGB2, BITS_SRCRGB, u32(value));
1835     }
1836 
1837     //! @brief アルファ演算のソース 0 を設定します。
1838     //!
1839     //! @param value 設定する値です。
1840     //!
1841     //! @since 2009/09/18 初版。
1842     //!
SetSrcAlpha0TevStage1843     void SetSrcAlpha0(TevSrc value)
1844     {
1845         NW_ASSERT(value < TEVSRC_MAX);
1846         bits1 = internal::SetBits(u32(bits1), POS1_SRCALPHA0, BITS_SRCALPHA, u32(value));
1847     }
1848 
1849     //! @brief アルファ演算のソース 1 を設定します。
1850     //!
1851     //! @param value 設定する値です。
1852     //!
1853     //! @since 2009/09/18 初版。
1854     //!
SetSrcAlpha1TevStage1855     void SetSrcAlpha1(TevSrc value)
1856     {
1857         NW_ASSERT(value < TEVSRC_MAX);
1858         bits1 = internal::SetBits(u32(bits1), POS1_SRCALPHA1, BITS_SRCALPHA, u32(value));
1859     }
1860 
1861     //! @brief アルファ演算のソース 2 を設定します。
1862     //!
1863     //! @param value 設定する値です。
1864     //!
1865     //! @since 2009/09/18 初版。
1866     //!
SetSrcAlpha2TevStage1867     void SetSrcAlpha2(TevSrc value)
1868     {
1869         NW_ASSERT(value < TEVSRC_MAX);
1870         bits1 = internal::SetBits(u32(bits1), POS1_SRCALPHA2, BITS_SRCALPHA, u32(value));
1871     }
1872 
1873     //! @brief RGB演算のソース 0 のオペランドを設定します。
1874     //!
1875     //! @param value 設定する値です。
1876     //!
1877     //! @since 2009/09/18 初版。
1878     //!
SetOperandRgb0TevStage1879     void SetOperandRgb0(TevOpRgb value)
1880     {
1881         NW_ASSERT(value < TEVOPRGB_MAX);
1882         bits0 = internal::SetBits(u32(bits0), POS0_OPERANDRGB0, BITS_OPERANDRGB, u32(value));
1883     }
1884 
1885     //! @brief RGB演算のソース 1 のオペランドを設定します。
1886     //!
1887     //! @param value 設定する値です。
1888     //!
1889     //! @since 2009/09/18 初版。
1890     //!
SetOperandRgb1TevStage1891     void SetOperandRgb1(TevOpRgb value)
1892     {
1893         NW_ASSERT(value < TEVOPRGB_MAX);
1894         bits0 = internal::SetBits(u32(bits0), POS0_OPERANDRGB1, BITS_OPERANDRGB, u32(value));
1895     }
1896 
1897     //! @brief RGB演算のソース 2 のオペランドを設定します。
1898     //!
1899     //! @param value 設定する値です。
1900     //!
1901     //! @since 2009/09/18 初版。
1902     //!
SetOperandRgb2TevStage1903     void SetOperandRgb2(TevOpRgb value)
1904     {
1905         NW_ASSERT(value < TEVOPRGB_MAX);
1906         bits0 = internal::SetBits(u32(bits0), POS0_OPERANDRGB2, BITS_OPERANDRGB, u32(value));
1907     }
1908 
1909     //! @brief アルファ演算のソース 0 のオペランドを設定します。
1910     //!
1911     //! @param value 設定する値です。
1912     //!
1913     //! @since 2009/09/18 初版。
1914     //!
SetOperandAlpha0TevStage1915     void SetOperandAlpha0(TevOpAlp value)
1916     {
1917         NW_ASSERT(value < TEVOPALP_MAX);
1918         bits1 = internal::SetBits(u32(bits1), POS1_OPERANDALPHA0, BITS_OPERANDALPHA, u32(value));
1919     }
1920 
1921     //! @brief アルファ演算のソース 1 のオペランドを設定します。
1922     //!
1923     //! @param value 設定する値です。
1924     //!
1925     //! @since 2009/09/18 初版。
1926     //!
SetOperandAlpha1TevStage1927     void SetOperandAlpha1(TevOpAlp value)
1928     {
1929         NW_ASSERT(value < TEVOPALP_MAX);
1930         bits1 = internal::SetBits(u32(bits1), POS1_OPERANDALPHA1, BITS_OPERANDALPHA, u32(value));
1931     }
1932 
1933     //! @brief アルファ演算のソース 2 のオペランドを設定します。
1934     //!
1935     //! @param value 設定する値です。
1936     //!
1937     //! @since 2009/09/18 初版。
1938     //!
SetOperandAlpha2TevStage1939     void SetOperandAlpha2(TevOpAlp value)
1940     {
1941         NW_ASSERT(value < TEVOPALP_MAX);
1942         bits1 = internal::SetBits(u32(bits1), POS1_OPERANDALPHA2, BITS_OPERANDALPHA, u32(value));
1943     }
1944 
1945     //! @brief RGB演算に対するスケールを設定します。
1946     //!
1947     //! @param value 設定する値です。
1948     //!
1949     //! @since 2009/09/18 初版。
1950     //!
SetScaleRgbTevStage1951     void SetScaleRgb(TevScale value)
1952     {
1953         NW_ASSERT(value < TEVSCALE_MAX);
1954         bits0 = internal::SetBits(u32(bits0), POS0_SCALERGB, BITS_SCALE, u32(value));
1955     }
1956 
1957     //! @brief アルファ演算に対するスケールを設定します。
1958     //!
1959     //! @param value 設定する値です。
1960     //!
1961     //! @since 2009/09/18 初版。
1962     //!
SetScaleAlphaTevStage1963     void SetScaleAlpha(TevScale value)
1964     {
1965         NW_ASSERT(value < TEVSCALE_MAX);
1966         bits1 = internal::SetBits(u32(bits1), POS1_SCALEALPHA, BITS_SCALE, u32(value));
1967     }
1968 
1969     //! @brief RGB演算で使用する定数レジスタのソースを設定します。
1970     //!
1971     //! @param value 設定する値です。
1972     //!
1973     //! @since 2009/09/18 初版。
1974     //!
SetKonstSelRgbTevStage1975     void SetKonstSelRgb(TevKonstSel value)
1976     {
1977         NW_ASSERT(value < TEVKONSTSEL_MAX);
1978         bits2 = internal::SetBits(u32(bits2), POS2_KONSTSELRGB, BITS_KONSTSEL, u32(value));
1979     }
1980 
1981     //! @brief アルファ演算で使用する定数レジスタのソースを設定します。
1982     //!
1983     //! @param value 設定する値です。
1984     //!
1985     //! @since 2009/09/18 初版。
1986     //!
SetKonstSelAlphaTevStage1987     void SetKonstSelAlpha(TevKonstSel value)
1988     {
1989         NW_ASSERT(value < TEVKONSTSEL_MAX);
1990         bits2 = internal::SetBits(u32(bits2), POS2_KONSTSELALPHA, BITS_KONSTSEL, u32(value));
1991     }
1992 
1993     //! @brief 前段の演算結果(RGB)をバッファに保存するか設定します。
1994     //!
1995     //! @param value 設定する値です。
1996     //!
1997     //! @since 2009/09/18 初版。
1998     //!
SetSavePrevRgbTevStage1999     void SetSavePrevRgb(bool value)
2000     {
2001         bits0 = internal::SetBit(u32(bits0), POS0_SAVEPREVRGB, value);
2002     }
2003 
2004     //! @brief 前段の演算結果(A)をバッファに保存するか設定します。
2005     //!
2006     //! @param value 設定する値です。
2007     //!
2008     //! @since 2009/09/18 初版。
2009     //!
SetSavePrevAlphaTevStage2010     void SetSavePrevAlpha(bool value)
2011     {
2012         bits1 = internal::SetBit(u32(bits1), POS1_SAVEPREVALPHA, value);
2013     }
2014 
2015     //! @brief RGBの演算のタイプを取得します。
2016     //!
2017     //! @return 現在の設定値を返します。
2018     //!
2019     //! @since 2009/09/18 初版。
2020     //!
GetCombineRgbTevStage2021     TevMode GetCombineRgb() const
2022     {
2023         return TevMode(internal::GetBits(u32(bits0), POS0_COMBINERGB, BITS_COMBINERGB));
2024     }
2025 
2026     //! @brief アルファの演算のタイプを取得します。
2027     //!
2028     //! @return 現在の設定値を返します。
2029     //!
2030     //! @since 2009/09/18 初版。
2031     //!
GetCombineAlphaTevStage2032     TevMode GetCombineAlpha() const
2033     {
2034         return TevMode(internal::GetBits(u32(bits1), POS1_COMBINEALPHA, BITS_COMBINEALPHA));
2035     }
2036 
2037     //! @brief RGB演算の入力 0 のソースを取得します。
2038     //!
2039     //! @return 現在の設定値を返します。
2040     //!
2041     //! @since 2009/09/18 初版。
2042     //!
GetSrcRgb0TevStage2043     TevSrc GetSrcRgb0() const
2044     {
2045         return TevSrc(internal::GetBits(u32(bits0), POS0_SRCRGB0, BITS_SRCRGB));
2046     }
2047 
2048     //! @brief RGB演算の入力 1 のソースを取得します。
2049     //!
2050     //! @return 現在の設定値を返します。
2051     //!
2052     //! @since 2009/09/18 初版。
2053     //!
GetSrcRgb1TevStage2054     TevSrc GetSrcRgb1() const
2055     {
2056         return TevSrc(internal::GetBits(u32(bits0), POS0_SRCRGB1, BITS_SRCRGB));
2057     }
2058 
2059     //! @brief RGB演算の入力 2 のソースを取得します。
2060     //!
2061     //! @return 現在の設定値を返します。
2062     //!
2063     //! @since 2009/09/18 初版。
2064     //!
GetSrcRgb2TevStage2065     TevSrc GetSrcRgb2() const
2066     {
2067         return TevSrc(internal::GetBits(u32(bits0), POS0_SRCRGB2, BITS_SRCRGB));
2068     }
2069 
2070     //! @brief アルファ演算の入力 0 のソースを取得します。
2071     //!
2072     //! @return 現在の設定値を返します。
2073     //!
2074     //! @since 2009/09/18 初版。
2075     //!
GetSrcAlpha0TevStage2076     TevSrc GetSrcAlpha0() const
2077     {
2078         return TevSrc(internal::GetBits(u32(bits1), POS1_SRCALPHA0, BITS_SRCALPHA));
2079     }
2080 
2081     //! @brief アルファ演算の入力 1 のソースを取得します。
2082     //!
2083     //! @return 現在の設定値を返します。
2084     //!
2085     //! @since 2009/09/18 初版。
2086     //!
GetSrcAlpha1TevStage2087     TevSrc GetSrcAlpha1() const
2088     {
2089         return TevSrc(internal::GetBits(u32(bits1), POS1_SRCALPHA1, BITS_SRCALPHA));
2090     }
2091 
2092     //! @brief アルファ演算の入力 2 のソースを取得します。
2093     //!
2094     //! @return 現在の設定値を返します。
2095     //!
2096     //! @since 2009/09/18 初版。
2097     //!
GetSrcAlpha2TevStage2098     TevSrc GetSrcAlpha2() const
2099     {
2100         return TevSrc(internal::GetBits(u32(bits1), POS1_SRCALPHA2, BITS_SRCALPHA));
2101     }
2102 
2103     //! @brief RGB演算の入力 0 のオペランドを取得します。
2104     //!
2105     //! @return 現在の設定値を返します。
2106     //!
2107     //! @since 2009/09/18 初版。
2108     //!
GetOperandRgb0TevStage2109     TevOpRgb GetOperandRgb0() const
2110     {
2111         return TevOpRgb(internal::GetBits(u32(bits0), POS0_OPERANDRGB0, BITS_OPERANDRGB));
2112     }
2113 
2114     //! @brief RGB演算の入力 1 のオペランドを取得します。
2115     //!
2116     //! @return 現在の設定値を返します。
2117     //!
2118     //! @since 2009/09/18 初版。
2119     //!
GetOperandRgb1TevStage2120     TevOpRgb GetOperandRgb1() const
2121     {
2122         return TevOpRgb(internal::GetBits(u32(bits0), POS0_OPERANDRGB1, BITS_OPERANDRGB));
2123     }
2124 
2125     //! @brief RGB演算の入力 2 のオペランドを取得します。
2126     //!
2127     //! @return 現在の設定値を返します。
2128     //!
2129     //! @since 2009/09/18 初版。
2130     //!
GetOperandRgb2TevStage2131     TevOpRgb GetOperandRgb2() const
2132     {
2133         return TevOpRgb(internal::GetBits(u32(bits0), POS0_OPERANDRGB2, BITS_OPERANDRGB));
2134     }
2135 
2136     //! @brief アルファ演算の入力 0 のオペランドを取得します。
2137     //!
2138     //! @return 現在の設定値を返します。
2139     //!
2140     //! @since 2009/09/18 初版。
2141     //!
GetOperandAlpha0TevStage2142     TevOpAlp GetOperandAlpha0() const
2143     {
2144         return TevOpAlp(internal::GetBits(u32(bits1), POS1_OPERANDALPHA0, BITS_OPERANDALPHA));
2145     }
2146 
2147     //! @brief アルファ演算の入力 1 のオペランドを取得します。
2148     //!
2149     //! @return 現在の設定値を返します。
2150     //!
2151     //! @since 2009/09/18 初版。
2152     //!
GetOperandAlpha1TevStage2153     TevOpAlp GetOperandAlpha1() const
2154     {
2155         return TevOpAlp(internal::GetBits(u32(bits1), POS1_OPERANDALPHA1, BITS_OPERANDALPHA));
2156     }
2157 
2158     //! @brief アルファ演算の入力 2 のオペランドを取得します。
2159     //!
2160     //! @return 現在の設定値を返します。
2161     //!
2162     //! @since 2009/09/18 初版。
2163     //!
GetOperandAlpha2TevStage2164     TevOpAlp GetOperandAlpha2() const
2165     {
2166         return TevOpAlp(internal::GetBits(u32(bits1), POS1_OPERANDALPHA2, BITS_OPERANDALPHA));
2167     }
2168 
2169     //! @brief RGB演算に対するスケールを取得します。
2170     //!
2171     //! @return 現在の設定値を返します。
2172     //!
2173     //! @since 2009/09/18 初版。
2174     //!
GetScaleRgbTevStage2175     TevScale GetScaleRgb() const
2176     {
2177         return TevScale(internal::GetBits(u32(bits0), POS0_SCALERGB, BITS_SCALE));
2178     }
2179 
2180     //! @brief アルファ演算に対するスケールを取得します。
2181     //!
2182     //! @return 現在の設定値を返します。
2183     //!
2184     //! @since 2009/09/18 初版。
2185     //!
GetScaleAlphaTevStage2186     TevScale GetScaleAlpha() const
2187     {
2188         return TevScale(internal::GetBits(u32(bits1), POS1_SCALEALPHA, BITS_SCALE));
2189     }
2190 
2191     //! @brief RGB演算で使用する定数レジスタのソースを取得します。
2192     //!
2193     //! @return 現在の設定値を返します。
2194     //!
2195     //! @since 2009/09/18 初版。
2196     //!
GetKonstSelRgbTevStage2197     TevKonstSel GetKonstSelRgb() const
2198     {
2199         return TevKonstSel(internal::GetBits(u32(bits2), POS2_KONSTSELRGB, BITS_KONSTSEL));
2200     }
2201 
2202     //! @brief アルファ演算で使用する定数レジスタのソースを取得します。
2203     //!
2204     //! @return 現在の設定値を返します。
2205     //!
2206     //! @since 2009/09/18 初版。
2207     //!
GetKonstSelAlphaTevStage2208     TevKonstSel GetKonstSelAlpha() const
2209     {
2210         return TevKonstSel(internal::GetBits(u32(bits2), POS2_KONSTSELALPHA, BITS_KONSTSEL));
2211     }
2212 
2213     //! @brief 前段の演算結果(RGB)をバッファに保存するかの設定を取得します。
2214     //!
2215     //! @return 現在の設定値を返します。
2216     //!
2217     //! @since 2009/09/18 初版。
2218     //!
GetSavePrevRgbTevStage2219     bool GetSavePrevRgb() const
2220     {
2221         return internal::TestBit(u32(bits0), POS0_SAVEPREVRGB);
2222     }
2223 
2224 
2225     //! @brief 前段の演算結果(A)をバッファに保存するかの設定を取得します。
2226     //!
2227     //! @return 現在の設定値を返します。
2228     //!
2229     //! @since 2009/09/18 初版。
2230     //!
GetSavePrevAlphaTevStage2231     bool GetSavePrevAlpha() const
2232     {
2233         return internal::TestBit(u32(bits1), POS1_SAVEPREVALPHA);
2234     }
2235 
2236     //@}
2237 
2238 protected:
2239     //! @details :private
2240     ut::ResU32 bits0;
2241 
2242     //! @details :private
2243     ut::ResU32 bits1;
2244 
2245     //! @details :private
2246     ut::ResU32 bits2;
2247 
2248     //! @details :private
2249     enum Bits
2250     {
2251         BITS_COMBINERGB     = 4,
2252         BITS_COMBINEALPHA   = 4,
2253         BITS_SRCRGB         = 4,
2254         BITS_SRCALPHA       = 4,
2255         BITS_OPERANDRGB     = 4,
2256         BITS_OPERANDALPHA   = 4, // at least 3
2257         BITS_SCALE          = 2,
2258         BITS_KONSTSEL       = 4,
2259         BITS_SAVEPREV       = 1
2260     };
2261 
2262     //! @details :private
2263     enum Pos0
2264     {
2265         POS0_SRCRGB0        = 0,
2266         POS0_SRCRGB1        = 4,
2267         POS0_SRCRGB2        = 8,
2268         POS0_OPERANDRGB0    = 12,
2269         POS0_OPERANDRGB1    = 16,
2270         POS0_OPERANDRGB2    = 20,
2271         POS0_COMBINERGB     = 24,
2272         POS0_SCALERGB       = 28,
2273         POS0_SAVEPREVRGB    = 30,
2274 
2275         FIELD0_SIZE         = 31
2276     };
2277 
2278     //! @details :private
2279     enum Pos1
2280     {
2281         POS1_SRCALPHA0      = 0,
2282         POS1_SRCALPHA1      = 4,
2283         POS1_SRCALPHA2      = 8,
2284         POS1_OPERANDALPHA0  = 12,
2285         POS1_OPERANDALPHA1  = 16,
2286         POS1_OPERANDALPHA2  = 20,
2287         POS1_COMBINEALPHA   = 24,
2288         POS1_SCALEALPHA     = 28,
2289         POS1_SAVEPREVALPHA  = 30,
2290 
2291         FIELD1_SIZE         = 31
2292     };
2293 
2294     //! @details :private
2295     enum Pos2
2296     {
2297         POS2_KONSTSELRGB    = 0,
2298         POS2_KONSTSELALPHA  = 4,
2299 
2300         FIELD2_SIZE         = 8
2301     };
2302 
2303     //! @details :private
2304     static void CompileCheck();
2305 };
2306 
2307 //---------------------------------------------------------------------------
2308 //! :category 描画
2309 //!
2310 //! @brief アルファコンペアの設定を持つ構造体です。
2311 //!
2312 //! @since 2009/09/18 初版。
2313 //---------------------------------------------------------------------------
2314 struct AlphaCompare
2315 {
2316     //----------------------------------------
2317     //! @name コンストラクタ/デストラクタ
2318     //@{
2319 
2320     //! @brief コンストラクタです。
2321     //!
2322     //! @details
2323     //! 常に通過する設定で初期化します。
2324     //!
2325     //! @since 2009/09/18 初版。
2326     //!
AlphaCompareAlphaCompare2327     AlphaCompare()
2328     {
2329         Set(ALPHATEST_ALWAYS, 0.f);
2330     }
2331 
2332     //! @brief コンストラクタです。
2333     //!
2334     //! @details
2335     //! 指定の設定で初期化します。
2336     //!
2337     //! @param aFunc 比較の条件です。
2338     //! @param aRef 比較の対象値です。
2339     //!
2340     //! @since 2009/09/18 初版。
2341     //!
AlphaCompareAlphaCompare2342     AlphaCompare(
2343         AlphaTest   aFunc,
2344         f32         aRef
2345     )
2346     {
2347         Set(aFunc, aRef);
2348     }
2349 
2350     //@}
2351 
2352     //----------------------------------------
2353     //! @name 設定/取得
2354     //@{
2355 
2356     //! @brief 設定を変更します
2357     //!
2358     //! @param aFunc 比較の条件です。
2359     //! @param aRef 比較の対象値です。
2360     //!
2361     //! @since 2009/09/18 初版。
2362     //!
SetAlphaCompare2363     void Set(
2364         AlphaTest   aFunc,
2365         f32         aRef
2366     )
2367     {
2368         NW_ASSERT(0 <= aFunc && aFunc < ALPHATEST_MAX);
2369 
2370         func = u8(aFunc);
2371         ref = aRef;
2372     }
2373 
2374     //! @brief アルファ比較の条件を取得します。
2375     //!
2376     //! @return 設定値を返します。
2377     //!
2378     //! @since 2009/09/18 初版。
2379     //!
GetFuncAlphaCompare2380     AlphaTest GetFunc() const
2381     {
2382         return AlphaTest(func);
2383     }
2384 
2385     //! @brief アルファ比較の対象の値を取得します。
2386     //!
2387     //! @return 設定値を返します。
2388     //!
2389     //! @since 2009/09/18 初版。
2390     //!
GetRefAlphaCompare2391     f32 GetRef() const
2392     {
2393         return ref;
2394     }
2395 
2396     //@}
2397 
2398 protected:
2399     //! @details :private
2400     u8 func;
2401 
2402     //! @details :private
2403     ut::ResF32 ref;
2404 };
2405 
2406 //---------------------------------------------------------------------------
2407 //! :category 描画
2408 //!
2409 //! @brief ブレンドモードの設定を持つ構造体です。
2410 //!
2411 //! @since 2009/09/18 初版。
2412 //---------------------------------------------------------------------------
2413 struct BlendMode
2414 {
2415     //----------------------------------------
2416     //! @name コンストラクタ/デストラクタ
2417     //@{
2418 
2419     //! @brief コンストラクタです。
2420     //!
2421     //! @details
2422     //! ブレンドを行わない(上書き)で初期化します。
2423     //!
2424     //! @since 2009/09/18 初版。
2425     //!
BlendModeBlendMode2426     BlendMode()
2427     {
2428         Set(
2429             BLENDOP_DISABLE,
2430             BLENDFACTORSRC_SRC_ALPHA,
2431             BLENDFACTORDST_INV_SRC_ALPHA,
2432             LOGICOP_DISABLE);
2433     }
2434 
2435     //! @brief コンストラクタです。
2436     //!
2437     //! @details
2438     //! 指定の設定で初期化します。
2439     //!
2440     //! @param aBlendOp ブレンド演算のタイプを指定します。
2441     //! @param aSrcFactor ピクセルカラーに乗算する値を指定します。
2442     //! @param aDstFactor フレームバッファカラーに乗算する値を指定します。
2443     //! @param aLogicOp  論理演算のタイプを指定します。
2444     //!
2445     //! @since 2009/09/18 初版。
2446     //!
BlendModeBlendMode2447     BlendMode(
2448         BlendOp         aBlendOp,
2449         BlendFactorSrc  aSrcFactor,
2450         BlendFactorDst  aDstFactor,
2451         LogicOp         aLogicOp
2452     )
2453     {
2454         Set(aBlendOp, aSrcFactor, aDstFactor, aLogicOp);
2455     }
2456 
2457     //@}
2458 
2459     //----------------------------------------
2460     //! @name 設定/取得
2461     //@{
2462 
2463     //! @brief 設定を変更します。
2464     //!
2465     //! @param aBlendOp ブレンド演算のタイプを指定します。
2466     //! @param aSrcFactor ピクセルカラーに乗算する値を指定します。
2467     //! @param aDstFactor フレームバッファカラーに乗算する値を指定します。
2468     //! @param aLogicOp  論理演算のタイプを指定します。
2469     //!
2470     //! @since 2009/09/18 初版。
2471     //!
SetBlendMode2472     void Set(
2473         BlendOp         aBlendOp,
2474         BlendFactorSrc  aSrcFactor,
2475         BlendFactorDst  aDstFactor,
2476         LogicOp         aLogicOp
2477     )
2478     {
2479         blendOp = u8(aBlendOp);
2480         srcFactor = u8(aSrcFactor);
2481         dstFactor = u8(aDstFactor);
2482         logicOp = u8(aLogicOp);
2483     }
2484 
2485     //! @brief ブレンド演算のタイプを取得します。
2486     //!
2487     //! @return 現在の設定値を返します。
2488     //!
2489     //! @since 2009/09/18 初版。
2490     //!
GetBlendOpBlendMode2491     BlendOp GetBlendOp() const
2492     {
2493         return BlendOp(blendOp);
2494     }
2495 
2496     //! @brief ピクセルカラーに乗算する値を取得します。
2497     //!
2498     //! @return 現在の設定値を返します。
2499     //!
2500     //! @since 2009/09/18 初版。
2501     //!
GetSrcFactorBlendMode2502     BlendFactorSrc GetSrcFactor() const
2503     {
2504         return BlendFactorSrc(srcFactor);
2505     }
2506 
2507     //! @brief フレームバッファカラーに乗算する値を取得します。
2508     //!
2509     //! @return 現在の設定値を返します。
2510     //!
2511     //! @since 2009/09/18 初版。
2512     //!
GetDstFactorBlendMode2513     BlendFactorDst GetDstFactor() const
2514     {
2515         return BlendFactorDst(dstFactor);
2516     }
2517 
2518     //! @brief 論理演算のタイプを取得します。
2519     //!
2520     //! @return 現在の設定値を返します。
2521     //!
2522     //! @since 2009/09/18 初版。
2523     //!
GetLogicOpBlendMode2524     LogicOp GetLogicOp() const
2525     {
2526         return LogicOp(logicOp);
2527     }
2528 
2529     //@}
2530 
2531 protected:
2532     //! @details :private
2533     ut::ResU8 blendOp;
2534 
2535     //! @details :private
2536     ut::ResU8 srcFactor;
2537 
2538     //! @details :private
2539     ut::ResU8 dstFactor;
2540 
2541     //! @details :private
2542     ut::ResU8 logicOp;
2543 };
2544 
2545 //---------------------------------------------------------------------------
2546 //! :category 描画
2547 //!
2548 //! @brief ペインの各辺の拡大量を持つ構造体です。
2549 //!
2550 //! @since 2009/09/18 初版。
2551 //---------------------------------------------------------------------------
2552 struct InflationLRTB
2553 {
2554     ut::ResF32          l; //!< 左辺の拡大量です。
2555     ut::ResF32          r; //!< 右辺の拡大量です。
2556     ut::ResF32          t; //!< 上辺の拡大量です。
2557     ut::ResF32          b; //!< 下辺の拡大量です。
2558 };
2559 
2560 //---------------------------------------------------------------------------
2561 //! :category 描画
2562 //!
2563 //! @brief ウィンドウペインのフレーム(枠)のサイズを持つ構造体です。
2564 //!
2565 //! @since 2009/09/18 初版。
2566 //---------------------------------------------------------------------------
2567 struct WindowFrameSize
2568 {
2569     ut::ResF32          l; //!< 左辺の枠の幅です。
2570     ut::ResF32          r; //!< 右辺の枠の幅です。
2571     ut::ResF32          t; //!< 上辺の枠の高さです。
2572     ut::ResF32          b; //!< 下辺の枠の高さです。
2573 };
2574 
2575 //---------------------------------------------------------------------------
2576 //! :category リソースアクセサ
2577 //!
2578 //! @brief 拡張ユーザデータクラスです。
2579 //!
2580 //! @details
2581 //! 名前文字列とデータがオブジェクトに続いて格納されます。
2582 //!
2583 //! @sa Pane
2584 //! @sa res::ExtUserDataList
2585 //!
2586 //! @since 2009/09/18 初版。
2587 //---------------------------------------------------------------------------
2588 class ExtUserData
2589 {
2590 public:
2591     //----------------------------------------
2592     //! @name コンストラクタ/デストラクタ
2593     //@{
2594 
2595     //! @brief コンストラクタです。
2596     //!
2597     //! @param nameStrOffset 拡張ユーザデータの名前へのオフセットです(オブジェクト先頭から)。
2598     //! @param dataOffset 拡張ユーザデータへのオフセットです(オブジェクト先頭から)。
2599     //! @param num 拡張ユーザデータの個数です。
2600     //! @param type 拡張ユーザデータのデータタイプです。
2601     //!
2602     //! @since 2009/09/18 初版。
2603     //!
ExtUserData(u32 nameStrOffset,u32 dataOffset,u16 num,u8 type)2604     ExtUserData(u32 nameStrOffset, u32 dataOffset, u16 num, u8 type)
2605         : m_NameStrOffset(nameStrOffset),
2606           m_DataOffset(dataOffset),
2607           m_Num(num),
2608           m_Type(type),
2609           m_Padding(0)
2610     {}
2611 
2612     //@}
2613 
2614     //----------------------------------------
2615     //! @name 設定/取得
2616     //@{
2617 
2618     //! @brief 拡張ユーザデータの名前を取得します。
2619     //!
2620     //! @return 拡張ユーザデータに設定されている名前を返します。
2621     //!
2622     //! @since 2009/09/18 初版。
2623     //!
GetName()2624     const char* GetName() const
2625     {
2626         return m_NameStrOffset ? internal::ConvertOffsToPtr<const char>(this, m_NameStrOffset): 0;
2627     }
2628 
2629     //! @brief 拡張ユーザデータの型を取得します。
2630     //!
2631     //! @details
2632     //! 文字列、整数配列、浮動小数点数配列のいずれかになります。
2633     //!
2634     //! @return データタイプを返します。
2635     //!
2636     //! @since 2009/09/18 初版。
2637     //!
GetType()2638     ExtUserDataType GetType() const
2639     {
2640         return ExtUserDataType(m_Type);
2641     }
2642 
2643     //! @brief 拡張ユーザデータの個数を取得します。
2644     //!
2645     //! @details
2646     //! データのタイプが文字列の場合は、文字列の長さになります。
2647     //!
2648     //! データのタイプが整数配列の場合は、配列の要素数になります。
2649     //!
2650     //! データのタイプが浮動小数点数配列の場合は、配列の要素数になります。
2651     //!
2652     //! @return データの個数を返します。
2653     //!
2654     //! @since 2009/09/18 初版。
2655     //!
GetNum()2656     u16 GetNum() const
2657     {
2658         return m_Num;
2659     }
2660 
2661     //! @brief 拡張ユーザデータを文字列として取得します。
2662     //!
2663     //! @details
2664     //! データのタイプが文字列である場合に有効です。
2665     //!
2666     //! @return 文字列のポインタを返します。
2667     //!
2668     //! @since 2009/09/18 初版。
2669     //!
GetString()2670     const char* GetString() const
2671     {
2672         NW_ASSERT(GetType() == EXTUSERDATATYPE_STRING);
2673         return internal::ConvertOffsToPtr<const char>(this, m_DataOffset);
2674     }
2675 
2676     //! @brief 拡張ユーザデータを整数配列として取得します。
2677     //!
2678     //! @details
2679     //! データのタイプが整数配列である場合に有効です。
2680     //!
2681     //! @return ResS32配列の先頭要素のポインタを返します。
2682     //!
2683     //! @since 2009/09/18 初版。
2684     //!
GetIntArray()2685     const ut::ResS32* GetIntArray() const
2686     {
2687         NW_ASSERT(GetType() == EXTUSERDATATYPE_INT);
2688         return internal::ConvertOffsToPtr<const ut::ResS32>(this, m_DataOffset);
2689     }
2690 
2691     //! @brief 拡張ユーザデータを浮動小数点数配列として取得します。
2692     //!
2693     //! @details
2694     //! データのタイプが浮動小数点配列である場合に有効です。
2695     //!
2696     //! @return ResF32配列の先頭要素のポインタを返します。
2697     //!
2698     //! @since 2009/09/18 初版。
2699     //!
GetFloatArray()2700     const ut::ResF32* GetFloatArray() const
2701     {
2702         NW_ASSERT(GetType() == EXTUSERDATATYPE_FLOAT);
2703         return internal::ConvertOffsToPtr<const ut::ResF32>(this, m_DataOffset);
2704     }
2705 
2706     //@}
2707 
2708 protected:
2709     //! @details :private
2710     //! データ名のオブジェクトの先頭を基準にしたオフセットです。
2711     ut::ResU32 m_NameStrOffset;
2712 
2713     //! @details :private
2714     //! データのオブジェクトの先頭を基準にしたオフセットです。
2715     ut::ResU32 m_DataOffset;
2716 
2717     //! @details :private
2718     ut::ResU16 m_Num;
2719 
2720     //! @details :private
2721     ut::ResU8 m_Type;
2722 
2723     //! @details :private
2724     ut::ResU8 m_Padding;
2725 };
2726 
2727 //---------------------------------------------------------------------------
2728 //! :category アニメーション
2729 //!
2730 //! @brief アニメーション区間タグで指定されるグループの情報です。
2731 //!
2732 //! @since 2009/09/18 初版。
2733 //---------------------------------------------------------------------------
2734 struct AnimationGroupRef
2735 {
2736     //----------------------------------------
2737     //! @name コンストラクタ/デストラクタ
2738     //@{
2739 
2740     //! @brief コンストラクタです。
2741     //!
2742     //! @since 2009/09/18 初版。
2743     //!
AnimationGroupRefAnimationGroupRef2744     AnimationGroupRef()
2745     :   flag(0)
2746     {
2747         std::memset(name,    0, sizeof(name));
2748         std::memset(padding, 0, sizeof(padding));
2749     }
2750 
2751     //@}
2752 
2753     //----------------------------------------
2754     //! @name 設定/取得
2755     //@{
2756 
2757     //! @brief グループ名を取得します。
2758     //!
2759     //! @return グループ名を返します。
2760     //!
2761     //! @since 2009/09/18 初版。
2762     //!
GetNameAnimationGroupRef2763     const char* GetName() const
2764     {
2765         return name;
2766     }
2767 
2768     //@}
2769 
2770     //! グループ名です。
2771     char                name[ResourceNameStrMax + 1];
2772     //! フラグです。
2773     ut::ResU8           flag;
2774     //! (未使用です)
2775     ut::ResU8           padding[2];
2776 };
2777 
2778 //---------------------------------------------------------------------------
2779 //! :category アニメーション
2780 //!
2781 //! @brief アニメーション共有情報です。
2782 //!
2783 //! @since 2009/09/18 初版。
2784 //---------------------------------------------------------------------------
2785 struct AnimationShareInfo
2786 {
2787     //----------------------------------------
2788     //! @name コンストラクタ/デストラクタ
2789     //@{
2790 
2791     //! @brief コンストラクタです。
2792     //!
2793     //! @since 2009/09/18 初版。
2794     //!
AnimationShareInfoAnimationShareInfo2795     AnimationShareInfo()
2796     {
2797         std::memset(srcPaneName,     0, sizeof(srcPaneName));
2798         std::memset(targetGroupName, 0, sizeof(targetGroupName));
2799         std::memset(padding,         0, sizeof(padding));
2800     }
2801 
2802     //@}
2803 
2804     //----------------------------------------
2805     //! @name 設定/取得
2806     //@{
2807 
2808     //! @brief アニメーションの共有元となるペインの名前を取得します。
2809     //!
2810     //! @return ペインの名前を返します。
2811     //!
2812     //! @since 2009/09/18 初版。
2813     //!
GetSrcPaneNameAnimationShareInfo2814     const char* GetSrcPaneName() const
2815     {
2816         return srcPaneName;
2817     }
2818 
2819     //! @brief アニメーションの共有対象となるペインが登録されているグループの名前を取得します。
2820     //!
2821     //! @return グループの名前を返します。
2822     //!
2823     //! @since 2009/09/18 初版。
2824     //!
GetTargetGroupNameAnimationShareInfo2825     const char* GetTargetGroupName() const
2826     {
2827         return targetGroupName;
2828     }
2829 
2830     //@}
2831 
2832     //! アニメーションの共有元となるペインの名前です。
2833     char                srcPaneName[ResourceNameStrMax + 1];
2834     //! アニメーションの共有対象となるペインが登録されているグループの名前です。
2835     char                targetGroupName[ResourceNameStrMax + 1];
2836     //! (未使用です)
2837     ut::ResU8           padding[2];
2838 };
2839 
2840 class AnimTransform;
2841 
2842 //---------------------------------------------------------------------------
2843 //! :category アニメーション
2844 //!
2845 //! @brief アニメーションにインデックスを付加したアニメーションリンク情報です。
2846 //!
2847 //! @since 2009/09/18 初版。
2848 //---------------------------------------------------------------------------
2849 class AnimationLink
2850 {
2851 public:
2852     //----------------------------------------
2853     //! @name コンストラクタ/デストラクタ
2854     //@{
2855 
2856     //! @brief コンストラクタです。
2857     //!
2858     //! @details
2859     //! 作成時はアニメーションと結びつけられていません。
2860     //!
2861     //! @since 2009/09/18 初版。
2862     //!
AnimationLink()2863     AnimationLink()
2864     {
2865         Reset();
2866     }
2867 
2868     //!@}
2869 
2870     //----------------------------------------
2871     //! @name 取得/設定
2872     //@{
2873 
2874     //! @brief アニメーションの設定を解除します。
2875     //!
2876     //! @since 2009/09/18 初版。
2877     //!
Reset()2878     void Reset()
2879     {
2880         Set(0, 0, false);
2881     }
2882 
2883     //! @brief アニメーションの全ての設定を行います。
2884     //!
2885     //! @param animTrans  アニメーションへのポインタです。
2886     //! @param idx  インデックスです。
2887     //! @param bDisable  アニメーションを無効状態で関連付ける場合は true を指定します。
2888     //!
2889     //! @since 2009/09/18 初版。
2890     //!
Set(AnimTransform * animTrans,u16 idx,bool bDisable)2891     void Set(
2892         AnimTransform* animTrans,
2893         u16 idx,
2894         bool bDisable
2895     )
2896     {
2897         m_AnimTrans = animTrans;
2898         m_Idx = idx;
2899         m_Disable = bDisable;
2900     }
2901 
2902     //! @brief アニメーションとインデックスを設定します。
2903     //!
2904     //! @details
2905     //! アニメーションの有効/無効状態は変更しません。
2906     //!
2907     //! @param animTrans  アニメーションへのポインタです。
2908     //! @param idx  インデックスです。
2909     //!
2910     //! @since 2009/09/18 初版。
2911     //!
SetAnimTransform(AnimTransform * animTrans,u16 idx)2912     void SetAnimTransform(
2913         AnimTransform* animTrans,
2914         u16 idx
2915     )
2916     {
2917         m_AnimTrans = animTrans;
2918         m_Idx = idx;
2919     }
2920 
2921     //! @brief アニメーションを取得します。
2922     //!
2923     //! @return アニメーションへのポインタを返します。
2924     //!
2925     //! @since 2009/09/18 初版。
2926     //!
GetAnimTransform()2927     AnimTransform* GetAnimTransform() const
2928     {
2929         return m_AnimTrans;
2930     }
2931 
2932     //! @brief インデックスを取得します。
2933     //!
2934     //! @return インデックスを返します。
2935     //!
2936     //! @since 2009/09/18 初版。
2937     //!
GetIndex()2938     u16 GetIndex() const
2939     {
2940         return m_Idx;
2941     }
2942 
2943     //@}
2944 
2945     //----------------------------------------
2946     //! @name 有効/無効
2947     //@{
2948 
2949     //! @brief このアニメーションリンク情報が有効かどうかを判定します。
2950     //!
2951     //! @return 有効であれば true を、無効であれば false を返します。
2952     //!
2953     //! @sa SetEnable
2954     //!
2955     //! @since 2009/09/18 初版。
2956     //!
IsEnable()2957     bool IsEnable() const
2958     {
2959         return ! m_Disable;
2960     }
2961 
2962     //! @brief このアニメーションリンク情報を有効または無効にします。
2963     //!
2964     //! @param bEnable  有効にする場合は true を指定します。
2965     //!
2966     //! @sa IsEnable
2967     //!
2968     //! @since 2009/09/18 初版。
2969     //!
SetEnable(bool bEnable)2970     void SetEnable(bool bEnable)
2971     {
2972         m_Disable = ! bEnable;
2973     }
2974 
2975     //@}
2976 
2977     //! :private
2978     //! @brief リンク情報です。
2979     ut::LinkListNode m_Link;
2980 
2981 protected:
2982     //! @details :private
2983     AnimTransform* m_AnimTrans;
2984 
2985     //! @details :private
2986     u16 m_Idx;
2987 
2988     //! @details :private
2989     bool m_Disable;
2990 };
2991 
2992 //! @name アニメーション
2993 //@{
2994 
2995 //! @brief アニメーションリンク情報の一覧を保持するリストの定義です。
2996 //!
2997 //! @since 2009/09/18 初版。
2998 //!
2999 typedef ut::LinkList<AnimationLink, offsetof(AnimationLink, m_Link)> AnimationList;
3000 
3001 //@}
3002 
3003 
3004 //---------------------------------------------------------------------------
3005 //! :category リソースアクセサ
3006 //!
3007 //! @brief テクスチャ情報を保持するクラスです。
3008 //!
3009 //! @sa ResourceAccessor
3010 //!
3011 //! @since 2009/09/18 初版。
3012 //---------------------------------------------------------------------------
3013 class TextureInfo
3014 {
3015 public:
3016     //! 無効なテクスチャを表します。
3017     static const u32 INVALID = 0;
3018 
3019     //----------------------------------------
3020     //! @name コンストラクタ/デストラクタ
3021     //@{
3022 
3023     //! @brief コンストラクタです。
3024     //!
3025     //! @details
3026     //! 無効なテクスチャオブジェクトへのハンドル (0) とサイズ (0, 0) で初期化します。
3027     //!
3028     //! @since 2009/09/18 初版。
3029     //!
TextureInfo()3030     TextureInfo()
3031         : m_TexObject(INVALID)
3032         , m_PhysicalAddress(NULL)
3033     {
3034     }
3035 
3036     //! @brief コピーコンストラクタです。
3037     //!
3038     //! @param src コピー元です。
3039     //!
3040     //! @since 2009/09/18 初版。
3041     //!
TextureInfo(const TextureInfo & src)3042     TextureInfo(const TextureInfo& src)
3043     {
3044         this->Set(src);
3045     }
3046 
3047     //! @brief コンストラクタです。
3048     //!
3049     //! @details
3050     //! テクスチャイメージの一部を利用する場合に使用します。
3051     //! realSize の幅と高さは2のべき乗でなければなりません。
3052     //!
3053     //! テクスチャイメージはデバイスメモリに置かれなければなりません。
3054     //!
3055     //! texObject は通常描画で使用されます。
3056     //!
3057     //! physicalAddress は Drawer の描画で使用されます。
3058     //!
3059     //! @param texObject テクスチャオブジェクトのハンドルです。
3060     //! @param physicalAddress テクスチャイメージの物理アドレスです。
3061     //! @param size 利用エリアのサイズ (幅, 高さ) です。
3062     //! @param realSize テクスチャのサイズ (幅, 高さ) です。
3063     //! @param format テクスチャのフォーマットです。
3064     //!
3065     //! @date 2010/05/14 physicalAddress 引数を追加しました。
3066     //! @date 2010/04/23 format 引数を追加しました。
3067     //! @since 2009/09/18 初版。
3068     //!
TextureInfo(u32 texObject,uptr physicalAddress,const TexSize & size,const TexSize & realSize,TexFormat format)3069     TextureInfo(
3070         u32 texObject,
3071         uptr physicalAddress,
3072         const TexSize& size,
3073         const TexSize& realSize,
3074         TexFormat format)
3075     {
3076         this->Set(texObject, physicalAddress, size, realSize, format);
3077     }
3078 
3079     //@}
3080 
3081     //----------------------------------------
3082     //! @name 設定/取得
3083     //@{
3084 
3085     //! @brief テクスチャの情報を設定します。
3086     //!
3087     //! @details
3088     //! すべての設定をコピーします。
3089     //!
3090     //! @param src コピー元です。
3091     //!
3092     //! @since 2009/09/18 初版。
3093     //!
Set(const TextureInfo & src)3094     void Set(const TextureInfo& src)
3095     {
3096         *this = src;
3097     }
3098 
3099     //! @brief テクスチャの情報を設定します。
3100     //!
3101     //! @details
3102     //! 指定の値を設定します。
3103     //!
3104     //! テクスチャイメージの一部を利用する場合に使用します。
3105     //! realSize の幅と高さは2のべき乗でなければなりません。
3106     //!
3107     //! テクスチャイメージはデバイスメモリに置かれなければなりません。
3108     //!
3109     //! texObject は通常描画で使用されます。
3110     //!
3111     //! physicalAddress は Drawer の描画で使用されます。
3112     //!
3113     //! @param texObject テクスチャオブジェクトのハンドルです。
3114     //! @param physicalAddress テクスチャイメージの物理アドレスです。
3115     //! @param size 利用エリアのサイズ (幅, 高さ) です。
3116     //! @param realSize テクスチャのサイズ (幅, 高さ) です。
3117     //! @param format テクスチャのフォーマットです。
3118     //!
3119     //! @date 2010/05/14 physicalAddress 引数を追加しました。
3120     //! @date 2010/04/23 format 引数を追加しました。
3121     //! @since 2009/09/18 初版。
3122     //!
Set(u32 texObject,uptr physicalAddress,const TexSize & size,const TexSize & realSize,TexFormat format)3123     void Set(
3124         u32 texObject,
3125         uptr physicalAddress,
3126         const TexSize& size,
3127         const TexSize& realSize,
3128         TexFormat format)
3129     {
3130         NW_ASSERT(IsPowerOfTwo(realSize.width));
3131         NW_ASSERT(IsPowerOfTwo(realSize.height));
3132 
3133         m_TexObject = texObject;
3134         m_PhysicalAddress = physicalAddress;
3135         m_Size = size;
3136         m_RealSize = realSize;
3137         m_Format = format;
3138     }
3139 
3140     //! @brief テクスチャオブジェクトを取得します。
3141     //!
3142     //! @return テクスチャオブジェクトへのハンドルを返します。
3143     //!
3144     //! @since 2009/09/18 初版。
3145     //!
GetTextureObject()3146     u32 GetTextureObject() const
3147     {
3148         return m_TexObject;
3149     }
3150 
3151     //! @brief テクスチャの利用領域のサイズ (幅, 高さ) を取得します。
3152     //!
3153     //! @return テクスチャの利用領域のサイズ (幅, 高さ) を返します。
3154     //!
3155     //! @since 2009/09/18 初版。
3156     //!
GetSize()3157     const TexSize& GetSize() const
3158     {
3159         return m_Size;
3160     }
3161 
3162     //! @brief テクスチャのサイズ (幅, 高さ) を取得します。
3163     //!
3164     //! @details
3165     //! テクスチャのサイズは幅、高さそれぞれ2のべき乗です。
3166     //!
3167     //! @return テクスチャのサイズ (幅, 高さ) を返します。
3168     //!
3169     //! @since 2009/09/18 初版。
3170     //!
GetRealSize()3171     const TexSize& GetRealSize() const
3172     {
3173         return m_RealSize;
3174     }
3175 
3176     //! @brief テクスチャの物理アドレスを取得します。
3177     //!
3178     //! @return テクスチャの物理アドレスを返します。
3179     //!
3180     //! @since 2010/05/14 初版。GetTextureImage()を置き換えました。
3181     //!
GetPhysicalAddress()3182     uptr GetPhysicalAddress() const
3183     {
3184         return m_PhysicalAddress;
3185     }
3186 
3187     //! @brief テクスチャフォーマットを取得します。
3188     //!
3189     //! @return テクスチャフォーマットを返します。
3190     //!
3191     //! @since 2010/04/23 初版。
3192     //!
GetFormat()3193     TexFormat GetFormat() const
3194     {
3195         return TexFormat(m_Format);
3196     }
3197 
3198     //! @brief テクスチャが有効か調べます。
3199     //!
3200     //! @return テクスチャが有効な場合には true を返します。
3201     //!
3202     //! @since 2010/07/16 初版。
3203     //!
IsValid()3204     bool IsValid() const
3205     {
3206 #ifdef NW_PLATFORM_CTR
3207         return m_PhysicalAddress != 0;
3208 #else
3209         return m_TexObject != INVALID;
3210 #endif
3211     }
3212 
3213     //@}
3214 
3215 protected:
3216     //! @details :private
3217     //! value が 2 のべき数であれば true を返す。
IsPowerOfTwo(u32 value)3218     static bool IsPowerOfTwo(u32 value)
3219     {
3220         return (value & ~(value - 1)) == value;
3221     }
3222 
3223 protected:
3224     //! @details :private
3225     u32 m_TexObject;
3226 
3227     //! @details :private
3228     uptr m_PhysicalAddress;
3229 
3230     //! @details :private
3231     TexSize m_Size;
3232 
3233     //! @details :private
3234     TexSize m_RealSize;
3235 
3236     //! @details :private
3237     u8 m_Format;
3238 };
3239 
3240 //! @name 描画
3241 //@{
3242 
3243 //! @brief ペインの四隅のテクスチャ座標を保持する配列の定義です。
3244 typedef nw::math::VEC2 TexCoordQuad[VERTEX_MAX];
3245 
3246 //@}
3247 
3248 //! @name リソースアクセサ
3249 //@{
3250 
3251 //! 登録したフォントを表します。
3252 typedef const void* FontKey;
3253 
3254 //! 登録したテクスチャを表します。
3255 typedef const void* TextureKey;
3256 
3257 //@}
3258 
3259 } // namespace nw::lyt
3260 } // namespace nw
3261 
3262 #endif // NW_LYT_TYPES_H_
3263