1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Material.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: 25949 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_LYT_MATERIAL_H_
17 #define NW_LYT_MATERIAL_H_
18 
19 //#include <revolution/tpl.h>
20 
21 #include <nw/ut/ut_Color.h>
22 #include <nw/math/math_Types.h>
23 
24 #include <nw/lyt/lyt_Config.h>
25 #include <nw/lyt/lyt_Drawer.h>
26 #include <nw/lyt/lyt_TexMap.h>
27 #include <nw/lyt/lyt_Types.h>
28 
29 namespace nw
30 {
31 namespace lyt
32 {
33 namespace res
34 {
35 
36 struct Material;
37 
38 } // namespace nw::lyt::res
39 
40 namespace internal
41 {
42 
43 // Matrix Member Numbers
44 struct MatMemNums
45 {
46     u32 texMap: 2;
47     u32 texSRT: 2;
48     u32 texCoordGen: 2;
49     u32 tevStage: 3;
50     u32 alpComp: 1;
51     u32 blendMode: 1;
52 };
53 
54 } // namespace nw::lyt::internal
55 
56 class AnimTransform;
57 class AnimResource;
58 class DrawInfo;
59 class Layout;
60 class TexMap;
61 struct ResBlockSet;
62 
63 //---------------------------------------------------------------------------
64 //! :category 描画
65 //!
66 //! @brief マテリアルの情報クラスです。
67 //!
68 //! @since 2009/09/18 初版。
69 //---------------------------------------------------------------------------
70 class Material
71 {
72 public:
73     enum
74     {
75         //! ユーザーがマテリアルを構築したかを示します。
76         FLAG_USER_ALLOCATED,
77         //! テクスチャのみを設定します。
78         FLAG_TEXTURE_ONLY,
79         //! テクスチャに関する内部のキャッシュがクリーンなことを示します。
80         FLAG_TEXTURE_CLEAN,
81         //! 列挙子の総数です。
82         FLAG_MAX
83     };
84 
85     //----------------------------------------
86     //! @name コンストラクタ/デストラクタ
87     //@{
88 
89     //! @brief コンストラクタです。
90     //!
91     //! @details
92     //! デフォルト設定の状態で初期化します。
93     //!
94     //! @since 2009/09/18 初版。
95     //!
96     Material();
97 
98     //! @brief コンストラクタです。
99     //!
100     //! @details
101     //! データブロックを反映した状態で初期化します。
102     //!
103     //! @param pRes マテリアルデータブロックへのポインタです。
104     //! @param resBlockSet ResBlockSet への参照です。
105     //!
106     //! @since 2009/09/18 初版。
107     //!
108     Material(
109         const res::Material* pRes,
110         const ResBlockSet& resBlockSet);
111 
112     //! @brief デストラクタです。
113     //!
114     //! @since 2009/09/18 初版。
115     //!
116     virtual ~Material();
117 
118     //@}
119 
120     //----------------------------------------
121     //! @name 取得/設定
122     //@{
123 
124     //! @brief マテリアルの設定を保持する領域を確保します。
125     //!
126     //! @param texMapNum 格納可能なテクスチャの数です。
127     //! @param texSRTNum 格納可能なテクスチャ SRT 変換行列の数です。
128     //! @param texCoordGenNum 格納可能なテクスチャ座標生成の数です。
129     //! @param tevStageNum 格納可能な TEV ステージの数です。
130     //! @param allocAlpComp アルファコンペアの設定領域を確保するには true を指定します。
131     //! @param allocBlendMode ブレンドモードの設定領域を確保するには true を指定します。
132     //!
133     //! @since 2009/09/18 初版。
134     //!
135     void ReserveMem(
136         u8 texMapNum,
137         u8 texSRTNum,
138         u8 texCoordGenNum,
139         u8 tevStageNum = 0,
140         bool allocAlpComp = false,
141         bool allocBlendMode = false);
142 
143     //! @brief マテリアルに格納することのできるテクスチャの上限数を取得します。
144     //!
145     //! @return TexMap を格納できる上限数を返します。
146     //!
147     //! @sa ReserveMem
148     //!
149     //! @since 2009/09/18 初版。
150     //!
GetTexMapCap()151     u8 GetTexMapCap() const
152     {
153         return u8(m_MemCap.texMap);
154     }
155 
156     //! @brief マテリアルに格納することのできるテクスチャ SRT 変換行列の上限数を取得します。
157     //!
158     //! @return テクスチャ SRT 変換行列を格納できる上限数を返します。
159     //!
160     //! @sa ReserveMem
161     //!
162     //! @since 2009/09/18 初版。
163     //!
GetTexSRTCap()164     u8 GetTexSRTCap() const
165     {
166         return u8(m_MemCap.texSRT);
167     }
168 
169     //! @brief マテリアルに格納することのできるテクスチャ座標生成の上限数を取得します。
170     //!
171     //! @return テクスチャ座標生成を格納できる上限数を返します。
172     //!
173     //! @sa ReserveMem
174     //!
175     //! @since 2009/09/18 初版。
176     //!
GetTexCoordGenCap()177     u8 GetTexCoordGenCap() const
178     {
179         return u8(m_MemCap.texCoordGen);
180     }
181 
182     //! @brief マテリアルに格納することのできる TEV ステージの上限数を取得します。
183     //!
184     //! @return TEV ステージを格納できる上限数を返します。
185     //!
186     //! @sa ReserveMem
187     //!
188     //! @since 2009/09/18 初版。
189     //!
GetTevStageCap()190     u8 GetTevStageCap() const
191     {
192         return u8(m_MemCap.tevStage);
193     }
194 
195     //! @brief マテリアルがアルファコンペアの設定を格納することができるかどうかを取得します。
196     //!
197     //! @return アルファコンペアの設定を格納できる場合は true を返します。
198     //!
199     //! @sa ReserveMem
200     //!
201     //! @since 2009/09/18 初版。
202     //!
IsAlphaCompareCap()203     bool IsAlphaCompareCap() const
204     {
205         return m_MemCap.alpComp != 0;
206     }
207 
208     //! @brief マテリアルがブレンドモード設定を格納することができるかどうかを取得します。
209     //!
210     //! @return ブレンドモード設定を格納できる場合は true を返します。
211     //!
212     //! @sa ReserveMem
213     //!
214     //! @since 2009/09/18 初版。
215     //!
IsBlendModeCap()216     bool IsBlendModeCap() const
217     {
218         return m_MemCap.blendMode != 0;
219     }
220 
221     //! @brief マテリアルの名前を取得します。
222     //!
223     //! @return マテリアルの名前を返します。
224     //!
225     //! @sa SetName
226     //!
227     //! @since 2009/09/18 初版。
228     //!
GetName()229     const char* GetName() const
230     {
231         return m_Name;
232     }
233 
234     //! @brief マテリアルの名前を設定します。
235     //!
236     //! @details
237     //! セットできるマテリアル名文字列の最大長は lyt::MaterialNameStrMax です。
238     //!
239     //! @param name 設定する名前です。
240     //!
241     //! @sa GetName
242     //!
243     //! @since 2009/09/18 初版。
244     //!
245     void SetName(const char* name);
246 
247     //@}
248 
249     //----------------------------------------
250     //! @name テクスチャ
251     //@{
252 
253     //! @brief テクスチャの数を取得します。
254     //!
255     //! @return テクスチャの数を返します。
256     //!
257     //! @sa SetTexMapNum
258     //!
259     //! @since 2009/09/18 初版。
260     //!
GetTexMapNum()261     u8 GetTexMapNum() const
262     {
263         return u8(m_MemNum.texMap);
264     }
265 
266     //! @brief テクスチャの数を設定します。
267     //!
268     //! @param num テクスチャの数です。
269     //!
270     //! @sa GetTexMapNum
271     //!
272     //! @since 2009/09/18 初版。
273     //!
274     void SetTexMapNum(u8 num);
275 
276     //! @brief テクスチャ座標生成の数を取得します。
277     //!
278     //! @return テクスチャ座標生成の数を返します。
279     //!
280     //! @sa SetTexCoordGenNum
281     //!
282     //! @since 2009/09/18 初版。
283     //!
GetTexCoordGenNum()284     u8 GetTexCoordGenNum() const
285     {
286         return u8(m_MemNum.texCoordGen);
287     }
288 
289     //! @brief テクスチャ座標生成の数を設定します。
290     //!
291     //! @param num テクスチャ座標生成の数です。
292     //!
293     //! @sa GetTexCoordGenNum
294     //!
295     //! @since 2009/09/18 初版。
296     //!
297     void SetTexCoordGenNum(u8 num);
298 
299     //! @brief テクスチャSRTの数を取得します。
300     //!
301     //! @return テクスチャSRTの数を返します。
302     //!
303     //! @sa SetSRTNum
304     //!
305     //! @since 2010/03/26 初版。
306     //!
GetTexSRTNum()307     u8 GetTexSRTNum() const
308     {
309         return u8(m_MemNum.texSRT);
310     }
311 
312     //! @brief テクスチャSRTの数を設定します。
313     //!
314     //! @param num テクスチャSRTの数です。
315     //!
316     //! @sa GetTexSRTNum
317     //!
318     //! @since 2010/03/26 初版。
319     //!
320     void SetTexSRTNum(u8 num);
321 
322     //! @brief テクスチャデータを取得します。
323     //!
324     //! @details
325     //! idx に ReserveMem() または SetTexMapNum() で設定したテクスチャの数よりも
326     //! 大きな値を渡した場合はアサートが発生します。
327     //!
328     //! @param idx インデックスです。
329     //!
330     //! @return オブジェクトへの参照を返します。
331     //!
332     //! @sa SetTexMap
333     //! @sa ReserveMem
334     //! @sa SetTexMapNum
335     //!
336     //! @since 2009/09/18 初版。
337     //!
GetTexMap(u32 idx)338     const TexMap& GetTexMap(u32 idx) const
339     {
340         NW_ASSERT(idx < m_MemNum.texMap);
341         return GetTexMapAry()[idx];
342     }
343 
344     //! @brief テクスチャデータを設定します。
345     //!
346     //! @details
347     //! idx に ReserveMem() または SetTexMapNum() で設定したテクスチャ数よりも
348     //! 大きな値を渡した場合はアサートが発生します。
349     //!
350     //! @param idx インデックスです。
351     //! @param value TexMap オブジェクトへの参照です。
352     //!
353     //! @sa GetTexMap
354     //! @sa ReserveMem
355     //! @sa SetTexMapNum
356     //!
357     //! @since 2009/09/18 初版。
358     //!
SetTexMap(u32 idx,const TexMap & value)359     void SetTexMap(u32 idx, const TexMap& value)
360     {
361         NW_ASSERT(idx < m_MemNum.texMap);
362         GetTexMapAry()[idx] = value;
363         this->SetTextureDirty();
364     }
365 
366     //! @brief テクスチャデータを設定します。
367     //!
368     //! @details
369     //! idx に ReserveMem() または SetTexMapNum() で設定したテクスチャ数よりも
370     //! 大きな値を渡した場合はアサートが発生します。
371     //!
372     //! @param idx インデックスです。
373     //! @param value TextureInfo オブジェクトへの参照です。
374     //!
375     //! @sa GetTexMap
376     //! @sa ReserveMem
377     //! @sa SetTexMapNum
378     //!
379     //! @since 2010/05/26 初版。
380     //!
SetTexMap(u32 idx,const TextureInfo & value)381     void SetTexMap(u32 idx, const TextureInfo& value)
382     {
383         NW_ASSERT(idx < m_MemNum.texMap);
384         GetTexMapAry()[idx].Set(value);
385         this->SetTextureDirty();
386     }
387 
388     //! @brief テクスチャ SRT 行列を取得します。
389     //!
390     //! @details
391     //! idx に ReserveMem() または SetTexSRTNum() で設定したテクスチャ SRT 行列の数よりも
392     //! 大きな値を渡した場合はアサートが発生します。
393     //!
394     //! @param idx インデックスです。
395     //!
396     //! @return オブジェクトへの参照を返します。
397     //!
398     //! @sa SetTexSRT
399     //! @sa ReserveMem
400     //! @sa SetTexSRTNum
401     //!
402     //! @since 2009/09/18 初版。
403     //!
GetTexSRT(u32 idx)404     const TexSRT& GetTexSRT(u32 idx) const
405     {
406         NW_ASSERT(idx < m_MemNum.texSRT);
407         return GetTexSRTAry()[idx];
408     }
409 
410     //! @brief テクスチャ SRT 行列を設定します。
411     //!
412     //! @details
413     //! idx に ReserveMem() または SetTexSRTNum() で設定したテクスチャ SRT 行列の数よりも
414     //! 大きな値を渡した場合はアサートが発生します。
415     //!
416     //! @param idx インデックスです。
417     //! @param value 設定するテクスチャ SRT 行列です。
418     //!
419     //! @sa GetTexSRT
420     //! @sa ReserveMem
421     //! @sa SetTexSRTNum
422     //!
423     //! @since 2009/09/18 初版。
424     //!
SetTexSRT(u32 idx,const TexSRT & value)425     void SetTexSRT(u32 idx, const TexSRT& value)
426     {
427         NW_ASSERT(idx < m_MemNum.texSRT);
428         GetTexSRTAry()[idx] = value;
429         this->SetTextureDirty();
430     }
431 
432     //! @brief テクスチャ座標生成を取得します。
433     //!
434     //! @details
435     //! idx に ReserveMem() または SetTexCoordGenNum() で設定した
436     //! テクスチャ座標生成の数よりも大きな値を渡した場合は
437     //! アサートが発生します。
438     //!
439     //! @param idx インデックスです。
440     //!
441     //! @return オブジェクトへの参照を返します。
442     //!
443     //! @sa SetTexCoordGen
444     //! @sa ReserveMem
445     //! @sa GetTexCoordGenNum
446     //! @sa SetTexCoordGenNum
447     //!
448     //! @since 2009/09/18 初版。
449     //!
GetTexCoordGen(u32 idx)450     const TexCoordGen& GetTexCoordGen(u32 idx) const
451     {
452         NW_ASSERT(idx < m_MemNum.texCoordGen);
453         return GetTexCoordGenAry()[idx];
454     }
455 
456     //! @brief テクスチャ座標生成を設定します。
457     //!
458     //! @details
459     //! idx に ReserveMem() または SetTexCoordGenNum() で設定したテクスチャ座標生成の
460     //! 格納可能数よりも大きな値を渡した場合はアサートが発生します。
461     //!
462     //! @param idx インデックスです。
463     //! @param value 設定するテクスチャ座標生成です。
464     //!
465     //! @sa GetTexCoordGen
466     //! @sa ReserveMem
467     //!
468     //! @since 2009/09/18 初版。
469     //!
SetTexCoordGen(u32 idx,const TexCoordGen & value)470     void SetTexCoordGen(u32 idx, const TexCoordGen& value)
471     {
472         NW_ASSERT(idx < m_MemNum.texCoordGen);
473         GetTexCoordGenAry()[idx] = value;
474         this->SetTextureDirty();
475     }
476 
477     //! @brief 成分を指定してテクスチャ SRT のパラメータを取得します。
478     //!
479     //! @details
480     //! テクスチャSRTの表示位置、回転、拡大率の成分を指定して取得します。
481     //!
482     //! eleIdx の指定には lyt::AnimTargetTexSRT の値を使用してください。
483     //!
484     //! @param idx TexSRT のインデックスです。
485     //! @param eleIdx 成分のインデックスです。
486     //!
487     //! @return テクスチャSRTの指定された成分を返します。
488     //!
489     //! @sa AnimTargetTexSRT
490     //! @sa SetTexSRTElement
491     //!
492     //! @since 2009/09/18 初版。
493     //!
GetTexSRTElement(u32 idx,u32 eleIdx)494     f32 GetTexSRTElement(u32 idx, u32 eleIdx) const
495     {
496         NW_ASSERT(idx < m_MemNum.texSRT);
497 
498         const f32 *const srtAry = &GetTexSRTAry()[idx].translate.x;
499         return srtAry[eleIdx];
500     }
501 
502     //! @brief 成分を指定してテクスチャ SRT のパラメータを設定します。
503     //!
504     //! @details
505     //! テクスチャの表示位置、回転、拡大率の成分を指定して設定します。
506     //!
507     //! eleIdx の指定には lyt::AnimTargetTexSRT を使用してください。
508     //!
509     //! idx に ReserveMem() または SetTexSRTNum() で設定したテクスチャ SRT 行列の
510     //! 格納可能数よりも大きな値を渡した場合はアサートが発生します。
511     //!
512     //! @param idx TexSRT のインデックスです。
513     //! @param eleIdx 成分のインデックスです。
514     //! @param value 成分の値です。
515     //!
516     //! @sa AnimTargetTexSRT
517     //! @sa GetTexSRTElement
518     //! @sa ReserveMem
519     //! @sa SetTexSRTNum
520     //!
521     //! @since 2009/09/18 初版。
522     //!
SetTexSRTElement(u32 idx,u32 eleIdx,f32 value)523     void SetTexSRTElement(u32 idx, u32 eleIdx, f32 value)
524     {
525         NW_ASSERT(idx < m_MemNum.texSRT);
526 
527         f32 *const srtAry = &GetTexSRTAry()[idx].translate.x;
528         srtAry[eleIdx] = value;
529         this->SetTextureDirty();
530     }
531 
532     //@}
533 
534     //----------------------------------------
535     //! @name TEV
536     //@{
537 
538     //! @brief TEV ステージ数を取得します。
539     //!
540     //! @return TEV ステージ数を返します。
541     //!
542     //! @sa SetTevStageNum
543     //!
544     //! @since 2009/09/18 初版。
545     //!
GetTevStageNum()546     u8 GetTevStageNum() const
547     {
548         return u8(m_MemNum.tevStage);
549     }
550 
551     //! @brief TEV ステージ数を設定します。
552     //!
553     //! @param num TEV ステージの数です。
554     //!
555     //! @sa GetTevStageNum
556     //!
557     //! @since 2009/09/18 初版。
558     //!
559     void SetTevStageNum(u8 num);
560 
561     //! @brief カラーを取得します。
562     //!
563     //! @details
564     //! idx には lyt::TevKonstSel の値を指定します。
565     //!
566     //! @param idx インデックスです。
567     //!
568     //! @return オブジェクトへの参照を返します。
569     //!
570     //! @sa SetColor
571     //! @sa lyt::TevKonstSel
572     //!
573     //! @since 2009/09/18 初版。
574     //!
GetColor(u32 idx)575     const ut::Color8& GetColor(u32 idx) const
576     {
577         NW_ASSERT(idx < MatColorMax);
578         return m_Colors[idx];
579     }
580 
581     //! @brief カラーを設定します。
582     //!
583     //! @details
584     //! idx には lyt::TevKonstSel の値を指定します。
585     //!
586     //! @param idx インデックスです。
587     //! @param value カラーの値です。
588     //!
589     //! @sa GetColor
590     //! @sa lyt::TevKonstSel
591     //!
592     //! @since 2009/09/18 初版。
593     //!
SetColor(u32 idx,ut::Color8 value)594     void SetColor(u32 idx, ut::Color8 value)
595     {
596         NW_ASSERT(idx < MatColorMax);
597         m_Colors[idx] = value;
598     }
599 
600     //! @brief カラーの種類を指定して TEV のカラーの成分を取得します。
601     //!
602     //! @details
603     //! colorType の指定には lyt::AnimTargetMatColor を使用してください。
604     //!
605     //! @param colorType カラーの種類です。
606     //!
607     //! @return カラー成分の値を返します。
608     //!
609     //! @sa SetColorElement
610     //! @sa lyt::AnimTargetMatColor
611     //!
612     //! @since 2009/09/18 初版。
613     //!
614     u8 GetColorElement(u32 colorType) const;
615 
616     //! @brief カラーの種類を指定して TEV のカラーの成分を設定します。
617     //!
618     //! @details
619     //! colorType の指定には lyt::AnimTargetMatColor を使用してください。
620     //!
621     //! @param colorType カラーの種類です。
622     //! @param value カラー値です。
623     //!
624     //! @sa GetColorElement
625     //! @sa lyt::AnimTargetMatColor
626     //!
627     //! @since 2009/09/18 初版。
628     //!
629     void SetColorElement(u32 colorType, u8 value);
630 
631     //! @brief TEV ステージを取得します。
632     //!
633     //! @details
634     //! idx に ReserveMem() 関数または SetTevStageNum() 関数で設定した
635     //! TEVステージ数よりも大きな値を渡した場合にはアサートが発生します。
636     //!
637     //! @param idx インデックスです。
638     //!
639     //! @return TevStage オブジェクトへの参照を返します。
640     //!
641     //! @sa SetTevStage
642     //! @sa ReserveMem
643     //! @sa GetTevStageNum
644     //! @sa SetTevStageNum
645     //!
646     //! @since 2009/09/18 初版。
647     //!
GetTevStage(u32 idx)648     const TevStage& GetTevStage(u32 idx) const
649     {
650         NW_ASSERT(idx < m_MemNum.tevStage);
651         return GetTevStageAry()[idx];
652     }
653 
654     //! @brief TEV ステージを設定します。
655     //!
656     //! @param idx インデックスです。
657     //! @param value TEV ステージ設定です。
658     //!
659     //! @details
660     //! idx に ReserveMem または SetTevStageNum で設定したTEVステージ数よりも
661     //! 大きな値を渡した場合はアサートが発生します。
662     //!
663     //! @sa ReserveMem
664     //! @sa GetTevStage
665     //!
666     //! @since 2009/09/18 初版。
667     //!
SetTevStage(u32 idx,const TevStage & value)668     void SetTevStage(u32 idx, const TevStage& value)
669     {
670         NW_ASSERT(idx < m_MemNum.tevStage);
671         GetTevStageAry()[idx] = value;
672     }
673 
674     //@}
675 
676     //----------------------------------------
677     //! @name マテリアル
678     //@{
679 
680     //! @brief アルファコンペア設定を取得します。
681     //!
682     //! @return アルファコンペア設定を返します。
683     //!
684     //! @sa SetAlphaCompare
685     //!
686     //! @since 2009/09/18 初版。
687     //!
GetAlphaCompare()688     const AlphaCompare& GetAlphaCompare() const
689     {
690         NW_ASSERT(IsAlphaCompareCap());
691         return *GetAlphaComparePtr();
692     }
693 
694     //! @brief アルファコンペアの設定を行います。
695     //!
696     //! @param value アルファコンペア設定です。
697     //!
698     //! @sa GetAlphaCompare
699     //!
700     //! @since 2009/09/18 初版。
701     //!
SetAlphaCompare(AlphaCompare value)702     void SetAlphaCompare(AlphaCompare value)
703     {
704         NW_ASSERT(IsAlphaCompareCap());
705         *GetAlphaComparePtr() = value;
706     }
707 
708     //! @brief ブレンドモード設定を取得します。
709     //!
710     //! @return ブレンドモード設定を返します。
711     //!
712     //! @sa SetBlendMode
713     //!
714     //! @since 2009/09/18 初版。
715     //!
GetBlendMode()716     const BlendMode& GetBlendMode() const
717     {
718         NW_ASSERT(IsBlendModeCap());
719         return *GetBlendModePtr();
720     }
721 
722     //! @brief ブレンドモードの設定を行います。
723     //!
724     //! @param value ブレンドモード設定です。
725     //!
726     //! @sa GetBlendMode
727     //!
728     //! @since 2009/09/18 初版。
729     //!
SetBlendMode(BlendMode value)730     void SetBlendMode(BlendMode value)
731     {
732         NW_ASSERT(IsBlendModeCap());
733         *GetBlendModePtr() = value;
734     }
735 
736     //! @brief テクスチャのみ使うかを取得します。
737     //!
738     //! @return テクスチャのみ使う場合は true を返します。
739     //!
740     //! @sa SetTextureOnly
741     //!
742     //! @since 2010/04/23 初版。
743     //!
GetTextureOnly()744     bool GetTextureOnly() const
745     {
746         return internal::TestBit(m_Flag, FLAG_TEXTURE_ONLY);
747     }
748 
749     //! @brief テクスチャのみ使うか取得します。
750     //!
751     //! @details
752     //! テクスチャ以外の設定は以前のマテリアルの設定をそのまま使います。
753     //!
754     //! @param value テクスチャのみ使う場合は true を指定します。
755     //!
756     //! @sa GetTextureOnly
757     //!
758     //! @since 2010/04/23 初版。
759     //!
SetTextureOnly(bool value)760     void SetTextureOnly(bool value)
761     {
762         m_Flag = internal::SetBit(m_Flag, FLAG_TEXTURE_ONLY, value);
763     }
764 
765     //@}
766 
767     //----------------------------------------
768     //! @name アニメーション
769     //@{
770 
771     //! @brief アニメーションを関連付けます。
772     //!
773     //! @param pAnimTrans pAnimTrans アニメーションへのポインタです。
774     //!
775     //! @sa UnbindAnimation
776     //! @sa UnbindAllAnimation
777     //!
778     //! @since 2009/09/18 初版。
779     //!
780     virtual void BindAnimation(AnimTransform* pAnimTrans);
781 
782     //! @brief アニメーションの関連付けを解除します。
783     //!
784     //! @details
785     //! pAnimTrans に NULL を渡した場合はすべての関連付けが解除されます。
786     //! (UnbindAllAnimation と同義)
787     //!
788     //! @param pAnimTrans アニメーションへのポインタです。
789     //!
790     //! @sa BindAnimation
791     //! @sa UnbindAllAnimation
792     //!
793     //! @since 2009/09/18 初版。
794     //!
795     virtual void UnbindAnimation(AnimTransform*  pAnimTrans);
796 
797     //! @brief すべてのアニメーションの関連付けを解除します。
798     //!
799     //! @details
800     //! UnbindAnimation の引数に NULL を渡すのと同義です。
801     //!
802     //! @sa BindAnimation
803     //! @sa UnbindAnimation
804     //!
805     //! @since 2009/09/18 初版。
806     //!
807     virtual void UnbindAllAnimation();
808 
809     //! @brief アニメーションの結果を計算します。
810     //!
811     //! @since 2009/09/18 初版。
812     //!
813     virtual void Animate();
814 
815     //! @brief アニメーションリンク情報を追加します。
816     //!
817     //! @param pAnimationLink アニメーションリンク情報へのポインタです。
818     //!
819     //! @since 2009/09/18 初版。
820     //!
821     void AddAnimationLink(AnimationLink* pAnimationLink);
822 
823     //! @brief アニメーションリンク情報を検索します。
824     //!
825     //! @details
826     //! pAnimTrans で指定したアニメーションを持つアニメーションリンク情報を検索します。
827     //!
828     //! @param pAnimTrans アニメーションへのポインタです。
829     //!
830     //! @return 見つかった場合はそのアニメーションリンク情報へのポインタを、
831     //! 見つからなかった場合は NULL を返します。
832     //!
833     //! @since 2009/09/18 初版。
834     //!
835     virtual AnimationLink* FindAnimationLink(AnimTransform* pAnimTrans);
836 
837     //! @brief アニメーションリンク情報を検索します。
838     //!
839     //! @details
840     //! animRes で指定したアニメーションリソースを使用するアニメーション
841     //! (AnimTransform)を持つアニメーションリンク情報を検索します。
842     //!
843     //! @param animRes アニメーションリソースオブジェクトへの参照です。
844     //!
845     //! @return 見つかった場合はそのアニメーションリンク情報へのポインタを、
846     //! 見つからなかった場合は NULL を返します。
847     //!
848     //! @sa AnimTransform
849     //!
850     //! @since 2009/09/18 初版。
851     //!
852     virtual AnimationLink* FindAnimationLink(const AnimResource& animRes);
853 
854     //! @brief アニメーションの有効/無効状態を設定します。
855     //!
856     //! @details
857     //! 指定したアニメーションの有効/無効状態を設定します。
858     //!
859     //! @param pAnimTrans アニメーションへのポインタです。
860     //! @param bEnable 設定する状態です。
861     //!
862     //! @since 2009/09/18 初版。
863     //!
864     virtual void SetAnimationEnable(
865         AnimTransform* pAnimTrans,
866         bool bEnable);
867 
868     //! @brief アニメーションの有効/無効状態を設定します。
869     //!
870     //! @details
871     //! 指定されたアニメーションリソースを使用するアニメーション
872     //! (AnimTransform)の有効/無効状態を設定します。
873     //!
874     //! @param animRes アニメーションリソースオブジェクトへの参照です。
875     //! @param bEnable 設定する状態です。
876     //!
877     //! @sa AnimTransform
878     //!
879     //! @since 2009/09/18 初版。
880     //!
881     virtual void SetAnimationEnable(
882         const AnimResource& animRes,
883         bool bEnable);
884 
885     //! @brief 関連付けられているアニメーションのリストを取得します。
886     //!
887     //! @return アニメーションリンク情報のリンクリストを返します。
888     //!
889     //! @sa AnimationLink
890     //!
891     //! @since 2009/09/18 初版。
892     //!
GetAnimationList()893     const AnimationList& GetAnimationList() const
894     {
895         return m_AnimList;
896     }
897 
898     //! @brief 関連付けられているアニメーションのリストを取得します。
899     //!
900     //! @return アニメーションリンク情報のリンクリストを返します。
901     //!
902     //! @sa AnimationLink
903     //!
904     //! @since 2009/09/18 初版。
905     //!
GetAnimationList()906     AnimationList& GetAnimationList()
907     {
908         return m_AnimList;
909     }
910 
911     //@}
912 
913     //----------------------------------------
914     //! @name その他
915     //@{
916 
917     //! @brief ユーザーがマテリアルを構築したかどうかを判定します。
918     //!
919     //! @return マテリアルをユーザーが構築した場合は true を返します。
920     //!
921     //! @since 2009/09/18 初版。
922     //!
IsUserAllocated()923     bool IsUserAllocated() const
924     {
925         return internal::TestBit(m_Flag, FLAG_USER_ALLOCATED);
926     }
927 
928     //! @brief ユーザーが構築したマテリアルであることを宣言します。
929     //!
930     //! @details
931     //! ユーザが構築したと宣言されたマテリアルはライブラリによって
932     //! 解放されません。
933     //!
934     //! @since 2010/08/27 初版。
935     //!
SetUserAllocated()936     void SetUserAllocated()
937     {
938         internal::SetBit(&m_Flag, FLAG_USER_ALLOCATED, true);
939     }
940 
941     //@}
942 
943 #ifdef NW_LYT_DMPGL_ENABLED
944     //! :private
945     //! @brief マテリアルの設置をグラフィックスシステムに送信します。
946     //!
947     //! @details
948     //! ペインの描画中に呼び出されます。
949     //!
950     //! @param drawInfo 描画情報です。
951     //! @param alpha マテリアルカラーに対するアルファ値です。
952     //! @param bInitFrameTransform フレーム変換にデフォルト値を設定する場合は true を指定します。
953     //!
954     virtual void SetupGraphics(
955         const DrawInfo& drawInfo,
956         u8 alpha,
957         bool bInitFrameTransform = true);
958 #endif
959 
960     //! @details :private
IsTextureDirty()961     bool IsTextureDirty() const
962     {
963         return ! internal::TestBit(m_Flag, FLAG_TEXTURE_CLEAN);
964     }
965 
966     //! @details :private
967     void SetTextureDirty(bool bDirty = true)
968     {
969         internal::SetBit(&m_Flag, FLAG_TEXTURE_CLEAN, ! bDirty);
970     }
971 
972 protected:
973     //! @brief テクスチャ画像設定の配列を取得します。
974     //!
975     //! @return テクスチャ画像設定の配列を返します。
976     //!
977     //! @since 2010/05/26 初版。
978     //!
979     const TexMap* GetTexMapAry() const;
980 
981     //! @brief テクスチャ画像設定の配列を取得します。
982     //!
983     //! @return テクスチャ画像設定の配列を返します。
984     //!
985     //! @since 2010/05/26 初版。
986     //!
987     TexMap* GetTexMapAry();
988 
989     //! @brief テクスチャ座標変換設定の配列を取得します。
990     //!
991     //! @return テクスチャ座標変換設定の配列を返します。
992     //!
993     //! @since 2010/05/26 初版。
994     //!
995     const TexSRT* GetTexSRTAry() const;
996 
997     //! @brief テクスチャ座標変換設定の配列を取得します。
998     //!
999     //! @return テクスチャ座標変換設定の配列を返します。
1000     //!
1001     //! @since 2010/05/26 初版。
1002     //!
1003     TexSRT* GetTexSRTAry();
1004 
1005     //! @brief テクスチャ座標生成設定の配列を取得します。
1006     //!
1007     //! @return テクスチャ座標生成設定の配列を返します。
1008     //!
1009     //! @since 2010/05/26 初版。
1010     //!
1011     const TexCoordGen* GetTexCoordGenAry() const;
1012 
1013     //! @brief テクスチャ座標生成設定の配列を取得します。
1014     //!
1015     //! @return テクスチャ座標生成設定の配列を返します。
1016     //!
1017     //! @since 2010/05/26 初版。
1018     //!
1019     TexCoordGen* GetTexCoordGenAry();
1020 
1021     //! @brief アルファコンペア設定のアドレスを取得します。
1022     //!
1023     //! @return アルファコンペア設定のアドレスを返します。
1024     //!
1025     //! @since 2010/05/26 初版。
1026     //!
1027     const AlphaCompare* GetAlphaComparePtr() const;
1028 
1029     //! @brief アルファコンペア設定のアドレスを取得します。
1030     //!
1031     //! @return アルファコンペア設定のアドレスを返します。
1032     //!
1033     //! @since 2010/05/26 初版。
1034     //!
1035     AlphaCompare* GetAlphaComparePtr();
1036 
1037     //! @brief ブレンドモード設定のアドレスを取得します。
1038     //!
1039     //! @return ブレンドモード設定のアドレスを返します。
1040     //!
1041     //! @since 2010/05/26 初版。
1042     //!
1043     const BlendMode* GetBlendModePtr() const;
1044 
1045     //! @brief ブレンドモード設定のアドレスを取得します。
1046     //!
1047     //! @return ブレンドモード設定のアドレスを返します。
1048     //!
1049     //! @since 2010/05/26 初版。
1050     //!
1051     BlendMode* GetBlendModePtr();
1052 
1053     //! @brief TEV設定のアドレスを取得します。
1054     //!
1055     //! @return TEV設定のアドレスを返します。
1056     //!
1057     //! @since 2010/05/26 初版。
1058     //!
1059     const TevStage* GetTevStageAry() const;
1060 
1061     //! @brief TEV設定の配列を取得します。
1062     //!
1063     //! @return TEV設定の配列を返します。
1064     //!
1065     //! @since 2010/05/26 初版。
1066     //!
1067     TevStage* GetTevStageAry();
1068 
1069 private:
1070     void Init();
1071     void InitMatMemNums(internal::MatMemNums* ptr);
1072 
1073     AnimationList m_AnimList;
1074     ut::Color8 m_Colors[MatColorMax];
1075     internal::MatMemNums m_MemCap;
1076     internal::MatMemNums m_MemNum;
1077     void* m_pMem;
1078     char m_Name[MaterialNameStrMax + 1];
1079     u8 m_Flag;
1080     u8 m_Padding[2];
1081 
1082 private:
1083     // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。
1084     Material(const Material& other);
1085     Material& operator = (const Material& other);
1086 
1087 };
1088 
1089 } // namespace nw::lyt
1090 } // namespace nw
1091 
1092 #endif // NW_LYT_MATERIAL_H_
1093