1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     anim_ResAnimGroup.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: 19812 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_ANIM_RESANIMATIONGROUP_H_
17 #define NW_ANIM_RESANIMATIONGROUP_H_
18 
19 #include <nw/types.h>
20 #include <nw/ut/ut_ResTypes.h>
21 #include <nw/ut/ut_ResUtil.h>
22 #include <nw/ut/ut_ResDeclMacros.h>
23 #include <nw/ut/ut_ResDictionary.h>
24 #include <nw/ut/ut_ResArrayTypes.h>
25 #include <nw/anim/res/anim_ResTypeInfo.h>
26 
27 namespace nw {
28 namespace gfx {
29     class SkeletalModel;
30     class Model;
31     class Camera;
32     class Light;
33 namespace res {
34     class ResModel;
35 }
36 }
37 }
38 
39 namespace nw {
40 namespace anim {
41 
42 namespace res {}
43 using namespace ::nw::anim::res;
44 
45 namespace res {
46 
47 //! アニメーション対象メンバの情報です。
48 //!
49 //! ObjectTypeとMemberTypeで、対象メンバを特定します。
50 //! アニメーション対象のクラスごとに、派生クラス(Res~Member)が存在します。(ObjectTypeと1対1対応)
51 //! 各派生クラスに、アニメーション対象インスタンスを特定するための情報があります。
52 //!
53 //! :private
54 struct ResAnimGroupMemberData
55 {
56     nw::ut::ResTypeInfo typeInfo;
57     ut::BinString   toPath;
58     ut::ResS32      m_MemberOffset;
59     ut::ResS32      m_BlendOperationIndex;
60     ut::ResU32      m_ObjectType;          //!< ResAnimGroupMember::ObjectType型の値。派生クラスの型を表す
61     ut::ResU32      m_MemberType;          //!< 各派生クラスのMemberType型の値
62 
63     // TODO: マテリアルのハッシュをクリアするためのハック。
64     // ハッシュ機構が削除されたら合わせて削除。
65     ut::ResU32      m_ResMaterialPtr;
66 };
67 
68 //! @details :private
69 struct ResBoneMemberData : public ResAnimGroupMemberData
70 {
71     ut::BinString   toBoneName;
72 };
73 
74 //! @details :private
75 struct ResMaterialColorMemberData : public ResAnimGroupMemberData
76 {
77     ut::BinString   toMaterialName;
78 };
79 
80 //! @details :private
81 struct ResTextureSamplerMemberData : public ResAnimGroupMemberData
82 {
83     ut::BinString   toMaterialName;
84     ut::ResU32      m_TextureMapperIndex;
85 };
86 
87 //! @details :private
88 struct ResTextureMapperMemberData : public ResAnimGroupMemberData
89 {
90     ut::BinString   toMaterialName;
91     ut::ResU32      m_TextureMapperIndex;
92 };
93 
94 //! @details :private
95 struct ResBlendOperationMemberData : public ResAnimGroupMemberData
96 {
97     ut::BinString   toMaterialName;
98 };
99 
100 //! @details :private
101 struct ResTextureCoordinatorMemberData : public ResAnimGroupMemberData
102 {
103     ut::BinString   toMaterialName;
104     ut::ResU32      m_TextureCoordinatorIndex;
105 };
106 
107 //! @details :private
108 struct ResModelMemberData : public ResAnimGroupMemberData
109 {
110 };
111 
112 //! @details :private
113 struct ResMeshMemberData : public ResAnimGroupMemberData
114 {
115     ut::ResU32      m_MeshIndex;
116 };
117 
118 //! @details :private
119 struct ResMeshNodeVisibilityMemberData : public ResAnimGroupMemberData
120 {
121     ut::BinString   toNodeName;
122 };
123 
124 //! @details :private
125 struct ResTransformMemberData : public ResAnimGroupMemberData
126 {
127 };
128 
129 //! @details :private
130 struct ResViewUpdaterMemberData : public ResAnimGroupMemberData
131 {
132 };
133 
134 //! @details :private
135 struct ResProjectionUpdaterMemberData : public ResAnimGroupMemberData
136 {
137 };
138 
139 //! @details :private
140 struct ResLightMemberData : public ResAnimGroupMemberData
141 {
142 };
143 
144 //! @details :private
145 struct ResFragmentLightMemberData : public ResAnimGroupMemberData
146 {
147 };
148 
149 //! @details :private
150 struct ResAmbientLightMemberData : public ResAnimGroupMemberData
151 {
152 };
153 
154 //! @details :private
155 struct ResVertexLightMemberData : public ResAnimGroupMemberData
156 {
157 };
158 
159 //! @details :private
160 struct ResHemiSphereLightMemberData : public ResAnimGroupMemberData
161 {
162 };
163 
164 //! @details :private
165 struct ResFogMemberData : public ResAnimGroupMemberData
166 {
167 };
168 
169 //! @details :private
170 struct ResAnimGroupData
171 {
172     nw::ut::ResTypeInfo typeInfo;
173     ut::ResU32      m_Flags;
174     ut::BinString   toName;
175     ut::ResS32      m_TargetType;
176     ut::ResS32      m_MemberInfoSetDicCount;
177     ut::Offset      toMemberInfoSetDic;
178     ut::ResS32      m_BlendOperationsTableCount;
179     ut::Offset      toBlendOperationsTable;
180 };
181 
182 //! @details :private
183 struct ResGraphicsAnimGroupData : public ResAnimGroupData
184 {
185     ut::ResS32      m_EvaluationTiming;
186 };
187 
188 
189 //! @brief アニメーション対象のデータメンバーを書き換えるための情報のリソースクラスです。
190 //!
191 //! アニメーション対象のオブジェクトと、そのうちのどのメンバーをアニメーションさせるかの情報を持ちます。
192 //! 各アニメーション対象に応じて、継承先のクラスが定義されています。
193 //!
194 class ResAnimGroupMember : public ut::ResCommon<ResAnimGroupMemberData>
195 {
196 public:
197     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnimGroupMember) };
198     enum { SIGNATURE = NW_RES_SIGNATURE32('AGMB') };
199 
200     //! アニメーション対象のオブジェクトです。
201     enum ObjectType
202     {
203         // スケルタルアニメーション
204         OBJECT_TYPE_BONE,
205 
206         // マテリアルアニメーション
207         OBJECT_TYPE_MATERIAL_COLOR,
208         OBJECT_TYPE_TEXTURE_SAMPLER,
209         OBJECT_TYPE_TEXTURE_MAPPER,
210         OBJECT_TYPE_BLEND_OPERATION,
211         OBJECT_TYPE_TEXTURE_COORDINATOR,
212 
213         // ビジビリティアニメーション
214         OBJECT_TYPE_MODEL,
215         OBJECT_TYPE_MESH,
216         OBJECT_TYPE_MESH_NODE_VISIBILITY,
217 
218         // トランスフォームアニメーション
219         OBJECT_TYPE_TRANSFORM,
220 
221         // カメラアニメーション
222         OBJECT_TYPE_VIEW_UPDATER,
223         OBJECT_TYPE_PROJECTION_UPDATER,
224 
225         // ライトアニメーション
226         OBJECT_TYPE_LIGHT,
227         OBJECT_TYPE_FRAGMENT_LIGHT,
228         OBJECT_TYPE_VERTEX_LIGHT,
229         OBJECT_TYPE_HEMISPHERE_LIGHT,
230         OBJECT_TYPE_AMBIENT_LIGHT,
231 
232         // フォグアニメーション
233         OBJECT_TYPE_FOG
234     };
235 
236     //! オブジェクト中の、どのメンバーをアニメーションさせるかの列挙です。継承先でも定義されます。
237     enum MemberType
238     {
239         // SetValueで処理が必要ない場合は、この値を使用します。
240         MEMBER_TYPE_INVALID = 0xFFFFFFFF
241     };
242 
243     NW_RES_CTOR( ResAnimGroupMember )
244 
245     //! @name リソースへのアクセス
246     //! @{
247 
248     //---------------------------------------------------------------------------
249     //! @fn           const char* GetPath() const
250     //! @brief        Path 情報を取得します。
251     //---------------------------------------------------------------------------
252     NW_RES_FIELD_STRING_DECL( Path )                        // GetPath()
253     //---------------------------------------------------------------------------
254     //! @fn           s32 GetMemberOffset() const
255     //! @brief        メンバーへのオフセット情報を取得します。
256     //---------------------------------------------------------------------------
257     //---------------------------------------------------------------------------
258     //! @fn           void SetMemberOffset(s32 offset)
259     //! @brief        メンバーへのオフセット情報を設定します。
260     //! @details :private
261     //---------------------------------------------------------------------------
262     NW_RES_FIELD_PRIMITIVE_DECL( s32, MemberOffset )        // GetMemberOffset()
263     //---------------------------------------------------------------------------
264     //! @fn           s32 GetBlendOperationIndex() const
265     //! @brief        ブレンドオペレーションのインデックス情報を取得します。
266     //---------------------------------------------------------------------------
267     //---------------------------------------------------------------------------
268     //! @fn           void SetBlendOperationIndex(s32 index)
269     //! @brief        ブレンドオペレーションのインデックス情報を設定します。
270     //! @details :private
271     //---------------------------------------------------------------------------
272     NW_RES_FIELD_PRIMITIVE_DECL( s32, BlendOperationIndex ) // GetBlendOperationIndex()
273     //---------------------------------------------------------------------------
274     //! @fn           u32 GetObjectType() const
275     //! @brief        派生クラスの型を示すObjectTypeを取得します。
276     //---------------------------------------------------------------------------
277     //---------------------------------------------------------------------------
278     //! @fn           void SetObjectType(u32 type)
279     //! @brief        ObjectTypeを設定します。
280     //! @details :private
281     //---------------------------------------------------------------------------
282     NW_RES_FIELD_PRIMITIVE_DECL( u32, ObjectType )          // GetObjectType()
283     //---------------------------------------------------------------------------
284     //! @fn           u32 GetMemberType() const
285     //! @brief        各派生クラスのMemberTypeを取得します。
286     //---------------------------------------------------------------------------
287     //---------------------------------------------------------------------------
288     //! @fn           void SetMemberType(u32 type)
289     //! @brief        MemberTypeを設定します。
290     //! @details      :private
291     //---------------------------------------------------------------------------
292     NW_RES_FIELD_PRIMITIVE_DECL( u32, MemberType )          // GetMemberType()
293     //---------------------------------------------------------------------------
294     //! @fn           u32 GetResMaterialPtr() const
295     //! @brief        マテリアルのハッシュをクリアするための参照先ポインタを取得します。
296     //! @details      :private
297     //---------------------------------------------------------------------------
298     //---------------------------------------------------------------------------
299     //! @fn           void SetResMaterialPtr(u32 ptr)
300     //! @brief        ResMAterialPtrを設定します。
301     //! @details      :private
302     //---------------------------------------------------------------------------
303     NW_RES_FIELD_PRIMITIVE_DECL( u32, ResMaterialPtr )      // GetResMaterialPtr()
304     //! @}
305 
306     //! @brief アニメーション対象メンバに値を設定します。
307     //! @param[in] object AnimGroup::GetTargetObject()の値です。
308     //! @param[in] value 設定する値です。メンバの種類で型が異なります。派生クラスを参照してください。
309     void SetValueForType(void* object, const void* value) const;
310 
311     //---------------------------------------------------------------------------
312     //! @brief        リソースの型情報を取得します。
313     //!
314     //! @return       型情報です。
315     //---------------------------------------------------------------------------
GetTypeInfo()316     nw::ut::ResTypeInfo     GetTypeInfo() const { return ref().typeInfo; }
317 };
318 typedef nw::ut::ResArrayPatricia<ResAnimGroupMember>::type        ResAnimGroupMemberArray; //!< @details :private
319 typedef nw::ut::ResArrayPatricia<const ResAnimGroupMember>::type  ResAnimGroupMemberArrayConst; //!< @details :private
320 
321 //! @details :private
322 class ResBoneMember : public ResAnimGroupMember
323 {
324 public:
325     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResBoneMember) };
326     enum { SIGNATURE = NW_RES_SIGNATURE32('AGBM') };
327 
328     enum MemberType
329     {
330         MEMBER_TYPE_TRANSFORM
331     };
332 
333     NW_RES_CTOR_INHERIT( ResBoneMember, ResAnimGroupMember )
334 
335     NW_RES_FIELD_STRING_DECL( BoneName ) // GetBoneName()
336 
337     // object: gfx::CalculatedTransform
338     // value: math::Transform3
339     void SetValue(void* object, const void* value) const;
340 };
341 
342 //! @details :private
343 class ResMaterialColorMember : public ResAnimGroupMember
344 {
345 public:
346     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMaterialColorMember) };
347     enum { SIGNATURE = NW_RES_SIGNATURE32('AGMC') };
348 
349     enum MemberType
350     {
351         MEMBER_TYPE_EMISSION,  // ResMaterialColor::SetEmission()
352         MEMBER_TYPE_AMBIENT,   // ResMaterialColor::SetAmbient()
353         MEMBER_TYPE_DIFFUSE,   // ResMaterialColor::SetDiffuse()
354         MEMBER_TYPE_SPECULAR0, // ResMaterialColor::SetSpecular0()
355         MEMBER_TYPE_SPECULAR1, // ResMaterialColor::SetSpecular1()
356         MEMBER_TYPE_CONSTANT0, // ResMaterialColor::SetConstant0()
357         MEMBER_TYPE_CONSTANT1, // ResMaterialColor::SetConstant1()
358         MEMBER_TYPE_CONSTANT2, // ResMaterialColor::SetConstant2()
359         MEMBER_TYPE_CONSTANT3, // ResMaterialColor::SetConstant3()
360         MEMBER_TYPE_CONSTANT4, // ResMaterialColor::SetConstant4()
361         MEMBER_TYPE_CONSTANT5  // ResMaterialColor::SetConstant5()
362     };
363 
364     NW_RES_CTOR_INHERIT( ResMaterialColorMember, ResAnimGroupMember )
365 
366     NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName()
367 
368     // object: gfx::ResMaterialColorData
369     // value: ut::FloatColor
370     void SetValue(void* object, const void* value) const;
371 };
372 
373 //! @details :private
374 class ResTextureSamplerMember : public ResAnimGroupMember
375 {
376 public:
377     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureSamplerMember) };
378     enum { SIGNATURE = NW_RES_SIGNATURE32('AGTS') };
379 
380     enum MemberType
381     {
382         MEMBER_TYPE_BORDER_COLOR // ResStandardTextureSampler::SetBorderColor(), ResPixelBasedTextureMapper::SetSampler()
383     };
384 
385     NW_RES_CTOR_INHERIT( ResTextureSamplerMember, ResAnimGroupMember )
386 
387     NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName()
388     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMapperIndex ) // GetTextureMapperIndex()
389 
390     // object: gfx::ResPixelBasedTextureMapperData
391     // value: ut::FloatColor
392     void SetValue(void* object, const void* value) const;
393 };
394 
395 //! @details :private
396 class ResTextureMapperMember : public ResAnimGroupMember
397 {
398 public:
399     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureMapperMember) };
400     enum { SIGNATURE = NW_RES_SIGNATURE32('AGTM') };
401 
402     enum MemberType
403     {
404         MEMBER_TYPE_TEXTURE // ResTextureMapper::SetTexture()
405     };
406 
407     NW_RES_CTOR_INHERIT( ResTextureMapperMember, ResAnimGroupMember )
408 
409     NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName()
410     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMapperIndex ) // GetTextureMapperIndex()
411 
412     // object: gfx::ResPixelBasedTextureMapperData
413     // value: ut::Offset (ResReferenceTextureへの参照)
414     void SetValue(void* object, const void* value) const;
415 };
416 
417 //! @details :private
418 class ResBlendOperationMember : public ResAnimGroupMember
419 {
420 public:
421     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResBlendOperationMember) };
422     enum { SIGNATURE = NW_RES_SIGNATURE32('AGBO') };
423 
424     enum MemberType
425     {
426         MEMBER_TYPE_BLEND_COLOR // ResBlendOperation::SetBlendColor()
427     };
428 
429     NW_RES_CTOR_INHERIT( ResBlendOperationMember, ResAnimGroupMember )
430 
431     NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName()
432 
433     // object: gfx::ResBlendOperationData
434     // value: ut::FloatColor
435     void SetValue(void* object, const void* value) const;
436 };
437 
438 //! @details :private
439 class ResTextureCoordinatorMember : public ResAnimGroupMember
440 {
441 public:
442     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureCoordinatorMember) };
443     enum { SIGNATURE = NW_RES_SIGNATURE32('AGTC') };
444 
445     enum MemberType
446     {
447         MEMBER_TYPE_SCALE, // ResTextureCoordinator::SetScale()
448         MEMBER_TYPE_ROTATE, // ResTextureCoordinator::SetRotate()
449         MEMBER_TYPE_TRANSLATE // ResTextureCoordinator::SetTranslate()
450     };
451 
452     NW_RES_CTOR_INHERIT( ResTextureCoordinatorMember, ResAnimGroupMember )
453 
454     NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName()
455     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCoordinatorIndex ) // GetTextureCoordinatorIndex()
456 
457     // object: gfx::ResTextureCoordinatorData
458     // value:
459     //   SCALE, TRANSLATE: math::VEC2
460     //   ROTATE: float
461     void SetValue(void* object, const void* value) const;
462 };
463 
464 //! @details :private
465 class ResModelMember : public ResAnimGroupMember
466 {
467 public:
468     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResModelMember) };
469     enum { SIGNATURE = NW_RES_SIGNATURE32('AGMO') };
470 
471     enum MemberType
472     {
473         MEMBER_TYPE_BRANCH_VISIBLE,
474         MEMBER_TYPE_VISIBLE
475     };
476 
477     NW_RES_CTOR_INHERIT( ResModelMember, ResAnimGroupMember )
478 
479     // object: gfx::ResModelData
480     // value: bool
481     void SetValue(void* object, const void* value) const;
482 };
483 
484 //! @details :private
485 class ResMeshMember : public ResAnimGroupMember
486 {
487 public:
488     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMeshMember) };
489     enum { SIGNATURE = NW_RES_SIGNATURE32('AGME') };
490 
491     enum MemberType
492     {
493         MEMBER_TYPE_VISIBLE
494     };
495 
496     NW_RES_CTOR_INHERIT( ResMeshMember, ResAnimGroupMember )
497 
498     NW_RES_FIELD_PRIMITIVE_DECL( u32, MeshIndex ) // GetMeshIndex()
499 
500     // object: gfx::ResMeshData
501     // value: bool
502     void SetValue(void* object, const void* value) const;
503 };
504 
505 //! @details :private
506 class ResMeshNodeVisibilityMember : public ResAnimGroupMember
507 {
508 public:
509     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMeshNodeVisibilityMember) };
510     enum { SIGNATURE = NW_RES_SIGNATURE32('AGND') };
511 
512     enum MemberType
513     {
514         MEMBER_TYPE_VISIBLE
515     };
516 
517     NW_RES_CTOR_INHERIT( ResMeshNodeVisibilityMember, ResAnimGroupMember )
518 
519     NW_RES_FIELD_STRING_DECL( NodeName ) // GetNodeName()
520 
521     // object: gfx::ResMeshNodeVisibilityData
522     // value: bool
523     void SetValue(void* object, const void* value) const;
524 };
525 
526 //! @details :private
527 class ResTransformMember : public ResAnimGroupMember
528 {
529 public:
530     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTransformMember) };
531     enum { SIGNATURE = NW_RES_SIGNATURE32('AGTF') };
532 
533     enum MemberType
534     {
535         MEMBER_TYPE_TRANSFORM
536     };
537 
538     NW_RES_CTOR_INHERIT( ResTransformMember, ResAnimGroupMember )
539 
540     // object: gfx::TransformNode
541     // value: CalculatedTransform
542     void SetValue(void* object, const void* value) const;
543 };
544 
545 //! @details :private
546 class ResViewUpdaterMember : public ResAnimGroupMember
547 {
548 public:
549     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResViewUpdaterMember) };
550     enum { SIGNATURE = NW_RES_SIGNATURE32('AGVU') };
551 
552     enum MemberType
553     {
554         MEMBER_TYPE_TARGET_POSITION,
555         MEMBER_TYPE_TWIST,
556         MEMBER_TYPE_UPWARD_VECTOR,
557         MEMBER_TYPE_VIEW_ROTATE,
558         MEMBER_TYPE_TRANSFORM
559     };
560 
561     NW_RES_CTOR_INHERIT( ResViewUpdaterMember, ResAnimGroupMember )
562 
563     // object: gfx::ResCameraViewUpdaterData
564     // value: 多様なので実装を参照
565     void SetValue(void* object, const void* value) const;
566 };
567 
568 //! @details :private
569 class ResProjectionUpdaterMember : public ResAnimGroupMember
570 {
571 public:
572     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResProjectionUpdaterMember) };
573     enum { SIGNATURE = NW_RES_SIGNATURE32('AGPU') };
574 
575     enum MemberType
576     {
577         MEMBER_TYPE_NEAR,
578         MEMBER_TYPE_FAR,
579         MEMBER_TYPE_FOVY,
580         MEMBER_TYPE_ASPECT_RATIO,
581         MEMBER_TYPE_HEIGHT,
582         MEMBER_TYPE_CENTER
583     };
584 
585     NW_RES_CTOR_INHERIT( ResProjectionUpdaterMember, ResAnimGroupMember )
586 
587     // object: gfx::ResCameraProjectionUpdaterData
588     // value: 多様なので実装を参照
589     void SetValue(void* object, const void* value) const;
590 };
591 
592 //! @details :private
593 class ResLightMember : public ResAnimGroupMember
594 {
595 public:
596     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) };
597     enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') };
598 
599     enum MemberType
600     {
601         MEMBER_TYPE_IS_LIGHT_ENABLED
602     };
603 
604     NW_RES_CTOR_INHERIT( ResLightMember, ResAnimGroupMember )
605 
606     // object: gfx::ResLightData
607     // value: 実装を参照
608     void SetValue(void* object, const void* value) const;
609 };
610 
611 //! @details :private
612 class ResFragmentLightMember : public ResAnimGroupMember
613 {
614 public:
615     // このクラスは実装上の都合で存在している。
616     // バイナリにはResLightMember型で格納されている。以下同様。
617     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) };
618     enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') };
619 
620     enum MemberType
621     {
622         MEMBER_TYPE_AMBIENT,
623         MEMBER_TYPE_DIFFUSE,
624         MEMBER_TYPE_SPECULAR0,
625         MEMBER_TYPE_SPECULAR1,
626         MEMBER_TYPE_DIRECTION,
627         MEMBER_TYPE_DISTANCE_ATTENUATION_START,
628         MEMBER_TYPE_DISTANCE_ATTENUATION_END
629     };
630 
631     NW_RES_CTOR_INHERIT( ResFragmentLightMember, ResAnimGroupMember )
632 
633     // object: gfx::ResFragmentLightData
634     // value: 実装を参照
635     void SetValue(void* object, const void* value) const;
636 };
637 
638 //! @details :private
639 class ResAmbientLightMember : public ResAnimGroupMember
640 {
641 public:
642     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) };
643     enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') };
644 
645     enum MemberType
646     {
647         MEMBER_TYPE_AMBIENT
648     };
649 
650     NW_RES_CTOR_INHERIT( ResAmbientLightMember, ResAnimGroupMember )
651 
652     // object: gfx::ResAmbientLightData
653     // value: 実装を参照
654     void SetValue(void* object, const void* value) const;
655 };
656 
657 //! @details :private
658 class ResVertexLightMember : public ResAnimGroupMember
659 {
660 public:
661     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) };
662     enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') };
663 
664     enum MemberType
665     {
666         MEMBER_TYPE_AMBIENT,
667         MEMBER_TYPE_DIFFUSE,
668         MEMBER_TYPE_DIRECTION,
669         MEMBER_TYPE_DISTANCE_ATTENUATION_CONSTANT,
670         MEMBER_TYPE_DISTANCE_ATTENUATION_LINEAR,
671         MEMBER_TYPE_DISTANCE_ATTENUATION_QUADRATIC,
672         MEMBER_TYPE_SPOT_EXPONENT,
673         MEMBER_TYPE_SPOT_CUTOFF_ANGLE
674     };
675 
676     NW_RES_CTOR_INHERIT( ResVertexLightMember, ResAnimGroupMember )
677 
678     // object: gfx::ResVertexLightData
679     // value: 実装を参照
680     void SetValue(void* object, const void* value) const;
681 };
682 
683 //! @details :private
684 class ResHemiSphereLightMember : public ResAnimGroupMember
685 {
686 public:
687     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) };
688     enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') };
689 
690     enum MemberType
691     {
692         MEMBER_TYPE_GROUND_COLOR,
693         MEMBER_TYPE_SKY_COLOR,
694         MEMBER_TYPE_DIRECTION,
695         MEMBER_TYPE_LERP_FACTOR
696     };
697 
698     NW_RES_CTOR_INHERIT( ResHemiSphereLightMember, ResAnimGroupMember )
699 
700     // object: gfx::ResHemiSphereLightData
701     // value: 実装を参照
702     void SetValue(void* object, const void* value) const;
703 };
704 
705 //! @details :private
706 class ResFogMember : public ResAnimGroupMember
707 {
708 public:
709     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResFogMember) };
710     enum { SIGNATURE = NW_RES_SIGNATURE32('AGFM') };
711 
712     enum MemberType
713     {
714         MEMBER_TYPE_COLOR
715     };
716 
717     NW_RES_CTOR_INHERIT( ResFogMember, ResAnimGroupMember )
718 
719     void SetValue(void* object, const void* value) const;
720 };
721 
722 //! @brief アニメーション対象の情報をまとめたリソースクラスです。
723 //!
724 class ResAnimGroup : public ut::ResCommon<ResAnimGroupData>
725 {
726 public:
727     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnimGroup) };
728     enum { SIGNATURE = NW_RES_SIGNATURE32('ANMG') };
729 
730     //! アニメーションのブレンド種類です。
731     enum BlendOperationType
732     {
733         BLENDOP_BOOL,
734         BLENDOP_INT,
735         BLENDOP_FLOAT,
736         BLENDOP_RGBA_COLOR,
737         BLENDOP_TRANSFORM,
738         BLENDOP_VECTOR2,
739         BLENDOP_VECTOR3,
740         BLENDOP_TEXTURE,
741         BLENDOP_CALCULATED_TRANSFORM,
742         BLENDOP_CALCULATED_TRANSFORM_QUAT,
743         BLENDOP_CALCULATED_TRANSFORM_ACCURATE_SCALE,
744         BLENDOP_CALCULATED_TRANSFORM_ACCURATE_SCALE_QUAT
745     };
746 
747     //! アニメーション対象の種類です。継承先でさらに定義されます。
748     enum TargetType
749     {
750         TARGET_TYPE_NONE    = 0, //!< 有効なメンバが存在しません。
751         TARGET_TYPE_UNKNOWN = -1 //!< 不正なメンバタイプです。
752     };
753 
754     //! アニメーション対象のフラグです。
755     enum Flag
756     {
757         FLAG_IS_CALCULATED_TRANSFORM = 0x1 << 0 //!< ベイクされたTransformのアニメーションであることを示します。
758     };
759 
760     NW_RES_CTOR( ResAnimGroup )
761 
762     //! @name リソースへのアクセス
763     //! @{
764 
765     //---------------------------------------------------------------------------
766     //! @fn           u32 GetFlags() const
767     //! @brief        フラグを取得します。
768     //---------------------------------------------------------------------------
769     //---------------------------------------------------------------------------
770     //! @fn           void SetFlags(u32 flags)
771     //! @brief        フラグを設定します。
772     //---------------------------------------------------------------------------
773     //---------------------------------------------------------------------------
774     //! @fn           void EnableFlags(u32 flags)
775     //! @brief        フラグを有効にします。
776     //---------------------------------------------------------------------------
777     //---------------------------------------------------------------------------
778     //! @fn           void DisableFlags(u32 flags)
779     //! @brief        フラグを無効にします。
780     //---------------------------------------------------------------------------
781     NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags()
782 
783     //---------------------------------------------------------------------------
784     //! @fn           const char* GetName() const
785     //! @brief        名前を取得します。
786     //---------------------------------------------------------------------------
787     NW_RES_FIELD_STRING_DECL( Name ) // GetName()
788 
789     //---------------------------------------------------------------------------
790     //! @fn           s32 GetTargetType() const
791     //! @brief        TargetType を取得します。
792     //---------------------------------------------------------------------------
793     //---------------------------------------------------------------------------
794     //! @fn           void SetTargetType(s32 targetType)
795     //! @brief        TargetTypeを設定します。
796     //---------------------------------------------------------------------------
797     NW_RES_FIELD_PRIMITIVE_DECL( s32, TargetType ) // GetMemberType()
798 
799     //---------------------------------------------------------------------------
800     //! @fn           s32 GetMemberInfoSetIndex(const char * key) const
801     //! @brief        メンバー情報データ中でのインデックス番号を取得します。
802     //---------------------------------------------------------------------------
803     //---------------------------------------------------------------------------
804     //! @fn           s32 GetMemberInfoSetCount() const
805     //! @brief        メンバー情報データの要素数を取得します。
806     //---------------------------------------------------------------------------
807     //---------------------------------------------------------------------------
808     //! @fn           ResAnimGroupMember GetMemberInfoSet(int idx)
809     //! @brief        メンバー情報データを取得します。
810     //---------------------------------------------------------------------------
811     NW_RES_FIELD_CLASS_DIC_DECL( ResAnimGroupMember, MemberInfoSet, ut::ResDicPatricia ) // GetMemberInfoSet(int), GetMemberInfoSet(const char*), GetMemberInfoSetIndex(const char*), GetMemberInfoSetCount()
812 
813     //---------------------------------------------------------------------------
814     //! @fn           s32* GetBlendOperations()
815     //! @brief        BlendOperations の先頭のポインタを取得します。
816     //---------------------------------------------------------------------------
817     //---------------------------------------------------------------------------
818     //! @fn           s32 GetBlendOperationsCount() const
819     //! @brief        BlendOperations の要素数を取得します。
820     //---------------------------------------------------------------------------
821     //---------------------------------------------------------------------------
822     //! @fn           s32 GetBlendOperations(int idx)
823     //! @brief        BlendOperation を取得します。
824     //---------------------------------------------------------------------------
825     //---------------------------------------------------------------------------
826     //! @fn           void SetBlendOperations(int idx, s32 op)
827     //! @brief        BlendOperation を設定します。
828     //! @details      :private
829     //---------------------------------------------------------------------------
830     NW_RES_FIELD_PRIMITIVE_LIST_DECL( s32, BlendOperations ) // GetBlendOperations(), GetBlendOperations(int), GetBlendOperationsCount()
831     //! @}
832 };
833 
834 //! @details :private
835 class ResGraphicsAnimGroup : public ResAnimGroup
836 {
837 public:
838     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResGraphicsAnimGroup) };
839     enum { SIGNATURE = NW_RES_SIGNATURE32('GXAG') };
840 
841     enum TargetType
842     {
843         TARGET_TYPE_BONE       = 1, //!< ボーンに対するメンバです。
844         TARGET_TYPE_MATERIAL   = 2, //!< マテリアルに対するメンバです。
845         TARGET_TYPE_VISIBILITY = 3, //!< ビジビリティに対するメンバです。
846         TARGET_TYPE_LIGHT      = 4, //!< ライトに対するメンバです。
847         TARGET_TYPE_CAMERA     = 5, //!< カメラに対するメンバです。
848         TARGET_TYPE_FOG        = 6  //!< フォグに対するメンバです。
849     };
850 
851     //! アニメーションの評価タイミングを表します。
852     enum EvaluationTiming
853     {
854         EVALUATION_BEFORE_WORLD_UPDATE, //!< シーンのワールドマトリクスを更新する前に評価されます。
855         EVALUATION_AFTER_SCENE_CULLING  //!< シーンの描画カリングを行った後に評価されます。(描画カリングは今後実装予定です)
856     };
857 
858     NW_RES_CTOR_INHERIT( ResGraphicsAnimGroup, ResAnimGroup )
859 
860     NW_RES_FIELD_PRIMITIVE_DECL( EvaluationTiming, EvaluationTiming )
861 };
862 
863 } /* namespace res */
864 } /* namespace anim */
865 } /* namespace nw */
866 
867 #endif /* NW_UT_RESANIMATIONGROUP_H_ */
868