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