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