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