1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     anim_ResAnim.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: 19698 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_ANIM_RESANIMATION_H_
17 #define NW_ANIM_RESANIMATION_H_
18 
19 #include <nw/types.h>
20 #include <nw/ut/ut_BinaryFileFormat.h>
21 #include <nw/ut/ut_ResTypes.h>
22 #include <nw/ut/ut_ResUtil.h>
23 #include <nw/ut/ut_ResDeclMacros.h>
24 #include <nw/ut/ut_ResArrayTypes.h>
25 #include <nw/anim/res/anim_ResAnimCurve.h>
26 #include <nw/anim/anim_AnimBlend.h>
27 #include <nw/gfx/gfx_Common.h>
28 #include <nw/gfx/res/gfx_ResTexture.h>
29 #include <nw/anim/res/anim_ResRevision.h>
30 
31 namespace nw {
32 
33 namespace gfx {
34 
35 class CalculatedTransform;
36 
37 namespace res {
38 
39 class ResGraphicsFile;
40 
41 } // namespace res
42 
43 } // namespace gfx
44 
45 namespace anim {
46 
47 namespace res {}
48 using namespace ::nw::anim::res;
49 
50 namespace res {
51 
52 //---------------------------------------------------------------------------
53 //! @brief        アニメーションセットのデータ構造です。
54 //---------------------------------------------------------------------------
55 //! @details :private
56 struct ResAnimData
57 {
58     enum LoopMode
59     {
60         LOOP_MODE_ONETIME,
61         LOOP_MODE_LOOP
62     };
63 
64     ut::BinaryRevisionHeader m_Header;
65     ut::BinString   toName;
66     ut::BinString   toTargetAnimGroupName;
67     ut::ResU8       m_LoopMode;
68     u8              padding_[3];
69     ut::ResF32      m_FrameSize;
70     ut::ResS32      m_MemberAnimSetDicCount;
71     ut::Offset      toMemberAnimSetDic;
72     ut::ResS32      m_UserDataDicCount;
73     ut::Offset      toUserDataDic;
74 };
75 
76 //! @details :private
77 struct ResLightAnimData
78 {
79     enum LightType
80     {
81         LIGHT_TYPE_FRAGMENT,
82         LIGHT_TYPE_VERTEX,
83         LIGHT_TYPE_HEMISPHERE,
84         LIGHT_TYPE_AMBIENT
85     };
86 
87     // ResFragmentLight::Kindの値
88     ut::ResU32 m_LightKind;
89 
90     // LightTypeの値
91     ut::ResU32 m_LightType;
92 };
93 
94 //---------------------------------------------------------------------------
95 //! @brief        メンバアニメーションの情報です。
96 //---------------------------------------------------------------------------
97 //! @details :private
98 struct ResMemberAnimData
99 {
100     ut::ResU32                      m_Flags;
101     ut::BinString                   toPath;
102     ut::BinString                   toTargetName;       // TODO: 未使用のようなので、確認して削除
103     ut::BinString                   toBaseObjectPath;   // TODO: 未使用のようなので、確認して削除
104     ut::ResU32                      m_PrimitiveType;
105 };
106 
107 //! @details :private
108 struct ResFloatAnimData : public ResMemberAnimData
109 {
110     enum Flag
111     {
112         FLAG_CONSTANT = 0x1 << 0
113     };
114 
115     union
116     {
117         ut::ResF32      constantValue;
118         ut::Offset      toCurve;
119     };
120 };
121 
122 //! @details :private
123 struct ResIntAnimData : public ResMemberAnimData
124 {
125     enum Flag
126     {
127         FLAG_CONSTANT = 0x1 << 0
128     };
129 
130     union
131     {
132         ut::ResS32      constantValue;
133         ut::Offset      toCurve;
134     };
135 };
136 
137 //! @details :private
138 struct ResBoolAnimData : public ResMemberAnimData
139 {
140     enum Flag
141     {
142         FLAG_CONSTANT       = 0x1 << 0,
143         FLAG_CONSTANT_VALUE = 0x1 << 1
144     };
145     ut::Offset      toCurve;
146 };
147 
148 //! @details :private
149 struct ResVec2AnimData : public ResMemberAnimData
150 {
151     enum Flag
152     {
153         FLAG_CONSTANT_X_SHIFT = 0,
154         FLAG_CONSTANT_Y_SHIFT,
155         FLAG_X_NOT_EXIST_SHIFT,
156         FLAG_Y_NOT_EXIST_SHIFT,
157 
158         FLAG_CONSTANT_X     = 0x1 << FLAG_CONSTANT_X_SHIFT,
159         FLAG_CONSTANT_Y     = 0x1 << FLAG_CONSTANT_Y_SHIFT,
160         FLAG_X_NOT_EXIST    = 0x1 << FLAG_X_NOT_EXIST_SHIFT,
161         FLAG_Y_NOT_EXIST    = 0x1 << FLAG_Y_NOT_EXIST_SHIFT
162     };
163 
164     union
165     {
166         ut::ResF32      constantValueCurveX;
167         ut::Offset      toCurveX;
168     };
169     union
170     {
171         ut::ResF32      constantValueCurveY;
172         ut::Offset      toCurveY;
173     };
174 };
175 
176 //! @details :private
177 struct ResVec3AnimData : public ResMemberAnimData
178 {
179     enum Flag
180     {
181         FLAG_CONSTANT_X_SHIFT = 0,
182         FLAG_CONSTANT_Y_SHIFT,
183         FLAG_CONSTANT_Z_SHIFT,
184         FLAG_X_NOT_EXIST_SHIFT,
185         FLAG_Y_NOT_EXIST_SHIFT,
186         FLAG_Z_NOT_EXIST_SHIFT,
187 
188         FLAG_CONSTANT_X     = 0x1 << FLAG_CONSTANT_X_SHIFT,
189         FLAG_CONSTANT_Y     = 0x1 << FLAG_CONSTANT_Y_SHIFT,
190         FLAG_CONSTANT_Z     = 0x1 << FLAG_CONSTANT_Z_SHIFT,
191         FLAG_X_NOT_EXIST    = 0x1 << FLAG_X_NOT_EXIST_SHIFT,
192         FLAG_Y_NOT_EXIST    = 0x1 << FLAG_Y_NOT_EXIST_SHIFT,
193         FLAG_Z_NOT_EXIST    = 0x1 << FLAG_Z_NOT_EXIST_SHIFT
194     };
195 
196     union
197     {
198         ut::ResF32      constantValueCurveX;
199         ut::Offset      toCurveX;
200     };
201     union
202     {
203         ut::ResF32      constantValueCurveY;
204         ut::Offset      toCurveY;
205     };
206     union
207     {
208         ut::ResF32      constantValueCurveZ;
209         ut::Offset      toCurveZ;
210     };
211 };
212 
213 //! @details :private
214 struct ResRgbaColorAnimData : public ResMemberAnimData
215 {
216     enum Flag
217     {
218         FLAG_CONSTANT_R_SHIFT = 0,
219         FLAG_CONSTANT_G_SHIFT,
220         FLAG_CONSTANT_B_SHIFT,
221         FLAG_CONSTANT_A_SHIFT,
222         FLAG_R_NOT_EXIST_SHIFT,
223         FLAG_G_NOT_EXIST_SHIFT,
224         FLAG_B_NOT_EXIST_SHIFT,
225         FLAG_A_NOT_EXIST_SHIFT,
226 
227         FLAG_CONSTANT_R     = 0x1 << FLAG_CONSTANT_R_SHIFT,
228         FLAG_CONSTANT_G     = 0x1 << FLAG_CONSTANT_G_SHIFT,
229         FLAG_CONSTANT_B     = 0x1 << FLAG_CONSTANT_B_SHIFT,
230         FLAG_CONSTANT_A     = 0x1 << FLAG_CONSTANT_A_SHIFT,
231         FLAG_R_NOT_EXIST    = 0x1 << FLAG_R_NOT_EXIST_SHIFT,
232         FLAG_G_NOT_EXIST    = 0x1 << FLAG_G_NOT_EXIST_SHIFT,
233         FLAG_B_NOT_EXIST    = 0x1 << FLAG_B_NOT_EXIST_SHIFT,
234         FLAG_A_NOT_EXIST    = 0x1 << FLAG_A_NOT_EXIST_SHIFT
235     };
236 
237     union
238     {
239         ut::ResF32      constantValueCurveR;
240         ut::Offset      toCurveR;
241     };
242     union
243     {
244         ut::ResF32      constantValueCurveG;
245         ut::Offset      toCurveG;
246     };
247     union
248     {
249         ut::ResF32      constantValueCurveB;
250         ut::Offset      toCurveB;
251     };
252     union
253     {
254         ut::ResF32      constantValueCurveA;
255         ut::Offset      toCurveA;
256     };
257 };
258 
259 //! @details :private
260 struct ResTextureAnimData : public ResMemberAnimData
261 {
262     enum Flag
263     {
264         FLAG_CONSTANT = 0x1 << 0
265     };
266 
267     union
268     {
269         ut::ResF32      constantValueCurve;
270         ut::Offset      toCurve;
271     };
272 
273     ut::ResS32 m_TexturesTableCount;
274     ut::Offset toTexturesTable;
275 };
276 
277 //! @details :private
278 struct ResTransformAnimData : public ResMemberAnimData
279 {
280     // TODO: 項目はボーンのフラグに合わせて修正。
281     enum Flag
282     {
283         FLAG_IDENTITY_SHIFT     = 0,
284         FLAG_RT_ZERO_SHIFT,
285         FLAG_SCALE_ONE_SHIFT,
286         FLAG_SCALE_UNIFORM_SHIFT,
287         FLAG_ROTATE_ZERO_SHIFT,
288         FLAG_TRANSLATE_ZERO_SHIFT,
289 
290         FLAG_CONSTANT_SCALE_X_SHIFT,
291         FLAG_CONSTANT_SCALE_Y_SHIFT,
292         FLAG_CONSTANT_SCALE_Z_SHIFT,
293         FLAG_CONSTANT_ROTATE_X_SHIFT,
294         FLAG_CONSTANT_ROTATE_Y_SHIFT,
295         FLAG_CONSTANT_ROTATE_Z_SHIFT,
296         FLAG_CONSTANT_ROTATE_W_SHIFT,
297         FLAG_CONSTANT_TRANSLATE_X_SHIFT,
298         FLAG_CONSTANT_TRANSLATE_Y_SHIFT,
299         FLAG_CONSTANT_TRANSLATE_Z_SHIFT,
300 
301         FLAG_SCALE_X_NOT_EXIST_SHIFT,
302         FLAG_SCALE_Y_NOT_EXIST_SHIFT,
303         FLAG_SCALE_Z_NOT_EXIST_SHIFT,
304         FLAG_ROTATE_X_NOT_EXIST_SHIFT,
305         FLAG_ROTATE_Y_NOT_EXIST_SHIFT,
306         FLAG_ROTATE_Z_NOT_EXIST_SHIFT,
307         FLAG_ROTATE_W_NOT_EXIST_SHIFT,
308         FLAG_TRANSLATE_X_NOT_EXIST_SHIFT,
309         FLAG_TRANSLATE_Y_NOT_EXIST_SHIFT,
310         FLAG_TRANSLATE_Z_NOT_EXIST_SHIFT,
311 
312         FLAG_IDENTITY               = 0x1 << FLAG_IDENTITY_SHIFT,
313         FLAG_RT_ZERO                = 0x1 << FLAG_RT_ZERO_SHIFT,
314         FLAG_SCALE_ONE              = 0x1 << FLAG_SCALE_ONE_SHIFT,
315         FLAG_SCALE_UNIFORM          = 0x1 << FLAG_SCALE_UNIFORM_SHIFT,
316         FLAG_ROTATE_ZERO            = 0x1 << FLAG_ROTATE_ZERO_SHIFT,
317         FLAG_TRANSLATE_ZERO         = 0x1 << FLAG_TRANSLATE_ZERO_SHIFT,
318 
319         FLAG_CONSTANT_SCALE_X       = 0x1 << FLAG_CONSTANT_SCALE_X_SHIFT,
320         FLAG_CONSTANT_SCALE_Y       = 0x1 << FLAG_CONSTANT_SCALE_Y_SHIFT,
321         FLAG_CONSTANT_SCALE_Z       = 0x1 << FLAG_CONSTANT_SCALE_Z_SHIFT,
322         FLAG_CONSTANT_ROTATE_X      = 0x1 << FLAG_CONSTANT_ROTATE_X_SHIFT,
323         FLAG_CONSTANT_ROTATE_Y      = 0x1 << FLAG_CONSTANT_ROTATE_Y_SHIFT,
324         FLAG_CONSTANT_ROTATE_Z      = 0x1 << FLAG_CONSTANT_ROTATE_Z_SHIFT,
325         FLAG_CONSTANT_ROTATE_W      = 0x1 << FLAG_CONSTANT_ROTATE_W_SHIFT,
326         FLAG_CONSTANT_TRANSLATE_X   = 0x1 << FLAG_CONSTANT_TRANSLATE_X_SHIFT,
327         FLAG_CONSTANT_TRANSLATE_Y   = 0x1 << FLAG_CONSTANT_TRANSLATE_Y_SHIFT,
328         FLAG_CONSTANT_TRANSLATE_Z   = 0x1 << FLAG_CONSTANT_TRANSLATE_Z_SHIFT,
329 
330         FLAG_SCALE_X_NOT_EXIST      = 0x1 << FLAG_SCALE_X_NOT_EXIST_SHIFT,
331         FLAG_SCALE_Y_NOT_EXIST      = 0x1 << FLAG_SCALE_Y_NOT_EXIST_SHIFT,
332         FLAG_SCALE_Z_NOT_EXIST      = 0x1 << FLAG_SCALE_Z_NOT_EXIST_SHIFT,
333         FLAG_ROTATE_X_NOT_EXIST     = 0x1 << FLAG_ROTATE_X_NOT_EXIST_SHIFT,
334         FLAG_ROTATE_Y_NOT_EXIST     = 0x1 << FLAG_ROTATE_Y_NOT_EXIST_SHIFT,
335         FLAG_ROTATE_Z_NOT_EXIST     = 0x1 << FLAG_ROTATE_Z_NOT_EXIST_SHIFT,
336         FLAG_ROTATE_W_NOT_EXIST     = 0x1 << FLAG_ROTATE_W_NOT_EXIST_SHIFT,
337         FLAG_TRANSLATE_X_NOT_EXIST  = 0x1 << FLAG_TRANSLATE_X_NOT_EXIST_SHIFT,
338         FLAG_TRANSLATE_Y_NOT_EXIST  = 0x1 << FLAG_TRANSLATE_Y_NOT_EXIST_SHIFT,
339         FLAG_TRANSLATE_Z_NOT_EXIST  = 0x1 << FLAG_TRANSLATE_Z_NOT_EXIST_SHIFT,
340 
341         FLAG_SCALE_NOT_EXIST        = (FLAG_SCALE_X_NOT_EXIST | FLAG_SCALE_Y_NOT_EXIST | FLAG_SCALE_Z_NOT_EXIST),
342         FLAG_ROTATE_NOT_EXIST       = (FLAG_ROTATE_X_NOT_EXIST | FLAG_ROTATE_Y_NOT_EXIST | FLAG_ROTATE_Z_NOT_EXIST),
343         FLAG_TRANSLATE_NOT_EXIST    = (FLAG_TRANSLATE_X_NOT_EXIST | FLAG_TRANSLATE_Y_NOT_EXIST | FLAG_TRANSLATE_Z_NOT_EXIST)
344     };
345 
346     union
347     {
348         ut::ResF32      constantValueScaleX;
349         ut::Offset      toScaleX;
350     };
351 
352     union
353     {
354         ut::ResF32      constantValueScaleY;
355         ut::Offset      toScaleY;
356     };
357 
358     union
359     {
360         ut::ResF32      constantValueScaleZ;
361         ut::Offset      toScaleZ;
362     };
363 
364     union
365     {
366         ut::ResF32      constantValueRotateX;
367         ut::Offset      toRotateX;
368     };
369 
370     union
371     {
372         ut::ResF32      constantValueRotateY;
373         ut::Offset      toRotateY;
374     };
375 
376     union
377     {
378         ut::ResF32      constantValueRotateZ;
379         ut::Offset      toRotateZ;
380     };
381 
382     union
383     {
384         ut::ResF32      constantValueRotateW;
385         ut::Offset      toRotateW;
386     };
387 
388     union
389     {
390         ut::ResF32      constantValueTranslateX;
391         ut::Offset      toTranslateX;
392     };
393 
394     union
395     {
396         ut::ResF32      constantValueTranslateY;
397         ut::Offset      toTranslateY;
398     };
399 
400     union
401     {
402         ut::ResF32      constantValueTranslateZ;
403         ut::Offset      toTranslateZ;
404     };
405 };
406 
407 //! @details :private
408 struct ResBakedTransformAnimData : public ResMemberAnimData
409 {
410     enum Flag
411     {
412         FLAG_CONSTANT_TRANSLATE_SHIFT = 0,
413         FLAG_CONSTANT_ROTATE_SHIFT,
414         FLAG_CONSTANT_SCALE_SHIFT,
415         FLAG_TRANSLATE_NOT_EXIST_SHIFT,
416         FLAG_ROTATE_NOT_EXIST_SHIFT,
417         FLAG_SCALE_NOT_EXIST_SHIFT,
418 
419         FLAG_CONSTANT_TRANSLATE  = 0x1 << FLAG_CONSTANT_TRANSLATE_SHIFT,
420         FLAG_CONSTANT_ROTATE   = 0x1 << FLAG_CONSTANT_ROTATE_SHIFT,
421         FLAG_CONSTANT_SCALE   = 0x1 << FLAG_CONSTANT_SCALE_SHIFT,
422         FLAG_TRANSLATE_NOT_EXIST = 0x1 << FLAG_TRANSLATE_NOT_EXIST_SHIFT,
423         FLAG_ROTATE_NOT_EXIST = 0x1 << FLAG_ROTATE_NOT_EXIST_SHIFT,
424         FLAG_SCALE_NOT_EXIST  = 0x1 << FLAG_SCALE_NOT_EXIST_SHIFT
425     };
426 
427     // RotateはMatrix33で、
428     // Scale、TranslateはVector3で格納されています。
429     ut::Offset      toRotate;
430     ut::Offset      toTranslate;
431     ut::Offset      toScale;
432 };
433 
434 //! @brief 一つの要素のアニメーションデータを持つリソースクラスです。
435 //!
436 //! 要素に対応する継承先のクラスで、要素の型に即した評価関数などが定義されます。
437 //! 継承先のクラスは、Int,Floatのように、カーブの型ごとに定義されています。
438 //!
439 class ResMemberAnim : public ut::ResCommon< ResMemberAnimData >
440 {
441 public:
442     //! アニメーションする要素の型です。
443     enum PrimitiveType
444     {
445         PRIMITIVETYPE_FLOAT,
446         PRIMITIVETYPE_INT,
447         PRIMITIVETYPE_BOOL,
448         PRIMITIVETYPE_VECTOR2,
449         PRIMITIVETYPE_VECTOR3,
450         PRIMITIVETYPE_TRANSFORM,
451         PRIMITIVETYPE_RGBA_COLOR,
452         PRIMITIVETYPE_TEXTURE,
453         PRIMITIVETYPE_BAKED_TRANSFORM
454     };
455 
456     NW_RES_CTOR( ResMemberAnim )
457 
458     //!@name リソースへのアクセス
459     //!@{
460     NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags )           // GetFlags(), SetFlags()
461     NW_RES_FIELD_STRING_DECL( Path )                    // GetPath()
462     NW_RES_FIELD_STRING_DECL( TargetName )              // GetTargetName()
463     NW_RES_FIELD_STRING_DECL( BaseObjectPath )          // GetBaseObjectPath()
464     NW_RES_FIELD_PRIMITIVE_DECL( u32, PrimitiveType )   // GetPrimitiveType(), SetPrimitiveType()
465     //!@}
466 
467     //! リソースの初期化処理をおこないます。
468     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
469 
470     //! リソースの後始末をおこないます。
471     void Cleanup();
472 
473     //! プリミティブのサイズをバイト数で取得します。
474     int GetPrimitiveSize() const;
475 
476     //! タイプに応じてアニメーション結果を評価します。
477     bit32 EvaluateResultForType(
478         void* dstBuf,
479         bit32 dstFlags,
480         float frame,
481         const void* originalValue) const;
482 
483     //! タイプに応じてアニメーション結果のキャッシュを対象に適用します。
484     //! ブレンドオペレーションを使用しない場合に呼ばれます。
485     void ApplyCacheForType(
486         void* target,
487         const void* cacheBuf) const;
488 };
489 
490 typedef ut::ResArrayClass<ResMemberAnim>::type  ResMemberAnimArray; //!< @details :private
491 
492 //! @brief アニメーションのリソースクラスです。
493 //!
494 //! ResMemberAnimを束ねて、アニメーションとしてまとめます。
495 //! ループ再生の設定、フレーム数などの情報を持ちます。
496 //!
497 class ResAnim : public ut::ResCommon< ResAnimData >
498 {
499 public:
500     enum { BINARY_REVISION = REVISION_RES_ANIM_DATA };
501     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnim) };
502     enum { SIGNATURE = NW_RES_SIGNATURE32('ADAT') };
503 
504     NW_RES_CTOR( ResAnim )
505 
506     //!@name リソースへのアクセス
507     //!@{
508     NW_RES_FIELD_STRUCT_DECL( nw::ut::BinaryRevisionHeader, Header ) // GetHeader()
509     NW_RES_FIELD_STRING_DECL( Name )                    // GetName()
510     NW_RES_FIELD_STRING_DECL( TargetAnimGroupName )     // GetTargetAnimGroupName()
511     NW_RES_FIELD_PRIMITIVE_DECL( u8, LoopMode )         // GetLoopMode(), SetLoopMode()
512     NW_RES_FIELD_PRIMITIVE_DECL( f32, FrameSize )       // GetFrameSize(), SetFrameSize()
513     NW_RES_FIELD_CLASS_DIC_DECL( ResMemberAnim, MemberAnimSet, ut::ResDicPatricia ) // GetMemberAnimSet(int), GetMemberAnimSet(const char*), GetMemberAnimSetIndex(const char*), GetMemberAnimSetCount()
514     //---------------------------------------------------------------------------
515     //! @fn           s32 GetUserDataIndex(const char * key) const
516     //! @brief        ユーザデータの辞書データ中でのインデックス番号を取得します。
517     //---------------------------------------------------------------------------
518     //---------------------------------------------------------------------------
519     //! @fn           s32 GetUserDataCount() const
520     //! @brief        ユーザデータの要素数を取得します。
521     //---------------------------------------------------------------------------
522     //---------------------------------------------------------------------------
523     //! @fn           nw::ut::ResMetaData GetUserData(int idx)
524     //! @brief        ユーザデータを取得します。
525     //---------------------------------------------------------------------------
526     NW_RES_FIELD_CLASS_DIC_DECL( nw::ut::ResMetaData, UserData, ut::ResDicPatricia ) // GetUserData(int), GetUserData(const char*), GetUserDataIndex(const char*) GetUserDataCount()
527     //!@}
528 
529     //! リソースの初期化処理をおこないます。
530     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
531 
532     //! リソースの後始末をおこないます。
533     void Cleanup();
534 
535     //!@name リソースの生成
536     //!@{
537 
538     //! @brief 空のスケルタルアニメーションリソースを作成します。
539     //!
540     //! @param[in] allocator 生成に使用するアロケーターです。
541     //!
542     //! @return 空のスケルタルアニメーションリソースを返します。
CreateEmptySkeletalAnim(nw::os::IAllocator * allocator)543     static ResAnim CreateEmptySkeletalAnim(nw::os::IAllocator* allocator)
544     {
545         return CreateEmptyResAnim(allocator, "SkeletalAnimation");
546     }
547 
548     //! @brief 空のマテリアルアニメーションリソースを作成します。
549     //!
550     //! @param[in] allocator 生成に使用するアロケーターです。
551     //!
552     //! @return 空のマテリアルアニメーションリソースを返します。
CreateEmptyMaterialAnim(nw::os::IAllocator * allocator)553     static ResAnim CreateEmptyMaterialAnim(nw::os::IAllocator* allocator)
554     {
555         return CreateEmptyResAnim(allocator, "MaterialAnimation");
556     }
557 
558     //! @brief 空のビジビリティアニメーションリソースを作成します。
559     //!
560     //! @param[in] allocator 生成に使用するアロケーターです。
561     //!
562     //! @return 空のビジビリティアニメーションリソースを返します。
CreateEmptyVisibilityAnim(nw::os::IAllocator * allocator)563     static ResAnim CreateEmptyVisibilityAnim(nw::os::IAllocator* allocator)
564     {
565         return CreateEmptyResAnim(allocator, "VisibilityAnimation");
566     }
567 
568     //! @brief 空のカメラアニメーションリソースを作成します。
569     //!
570     //! @param[in] allocator 生成に使用するアロケーターです。
571     //!
572     //! @return 空のカメラアニメーションリソースを返します。
CreateEmptyCameraAnim(nw::os::IAllocator * allocator)573     static ResAnim CreateEmptyCameraAnim(nw::os::IAllocator* allocator)
574     {
575         return CreateEmptyResAnim(allocator, "CameraAnimation");
576     }
577 
578     //! @brief 空のライトアニメーションリソースを作成します。
579     //!
580     //! @param[in] allocator 生成に使用するアロケーターです。
581     //!
582     //! @return 空のライトアニメーションリソースを返します。
CreateEmptyLightAnim(nw::os::IAllocator * allocator)583     static ResAnim CreateEmptyLightAnim(nw::os::IAllocator* allocator)
584     {
585         return CreateEmptyResAnim(allocator, "LightAnimation");
586     }
587 
588     //!@}
589 private:
590     static ResAnim CreateEmptyResAnim(nw::os::IAllocator* allocator, const char* targetAnimGroupName);
591 };
592 
593 //! @details :private
594 class ResLightAnim : public ResAnim
595 {
596 public:
597     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightAnim) };
598     enum { SIGNATURE = NW_RES_SIGNATURE32('ADLT') };
599 
600     NW_RES_CTOR_INHERIT( ResLightAnim, ResAnim )
601 
602     NW_RES_FIELD_PRIMITIVE_DECL( u32, LightKind ) // GetLightKind(), SetLightKind()
603     NW_RES_FIELD_PRIMITIVE_DECL( u32, LightType ) // GetLightType(), SetLightType()
604 };
605 
606 #define NW_RESANM_GETCURVE_DECL( type, name, hasNoCurveFlag )                   \
607     const type* Get##name() const                                               \
608     {                                                                           \
609         if ( ref().m_Flags & (hasNoCurveFlag) )                                 \
610         {                                                                       \
611             return NULL;                                                        \
612         }                                                                       \
613         else                                                                    \
614         {                                                                       \
615             return reinterpret_cast<const type*>( ref().to##name.to_ptr() );    \
616         }                                                                       \
617     }                                                                           \
618                                                                                 \
619     type* Get##name()                                                           \
620     {                                                                           \
621         if ( ref().m_Flags & (hasNoCurveFlag) )                                 \
622         {                                                                       \
623             return NULL;                                                        \
624         }                                                                       \
625         else                                                                    \
626         {                                                                       \
627             return reinterpret_cast<type*>( ref().to##name.to_ptr() );          \
628         }                                                                       \
629     }                                                                           \
630 
631 
632 #define NW_RESANM_EVALUATE_FLOAT_DECL(name, constantFlag)                       \
633     f32 Evaluate##name( f32 frame ) const                                       \
634     {                                                                           \
635         if ( ref().m_Flags & (constantFlag) )                                   \
636         {                                                                       \
637             return ref().constantValue##name;                                   \
638         }                                                                       \
639         else                                                                    \
640         {                                                                       \
641             return CalcFloatCurve(                                              \
642                     reinterpret_cast<const ResFloatCurveData*>( ref().to##name.to_ptr() ), \
643                     frame );                                                    \
644         }                                                                       \
645     }                                                                           \
646 
647 
648 #define NW_RESANM_EVALUATE_INT_DECL(name, constantFlag)                         \
649     s32 Evaluate##name( f32 frame ) const                                       \
650     {                                                                           \
651         if ( ref().m_Flags & (constantFlag) )                                   \
652         {                                                                       \
653             return ref().constantValue##name;                                   \
654         }                                                                       \
655         else                                                                    \
656         {                                                                       \
657             return CalcIntCurve(                                                \
658                     reinterpret_cast<const ResIntCurveData*>( ref().to##name.to_ptr() ), \
659                     frame );                                                    \
660         }                                                                       \
661     }                                                                           \
662 
663 
664 #define NW_RESANM_EVALUATE_VEC3_DECL(name, constantFlag)                        \
665     void Evaluate##name( math::VEC3* result, bit32* flags, f32 frame ) const    \
666     {                                                                           \
667         if ( ref().m_Flags & (constantFlag) )                                   \
668         {                                                                       \
669             CalcVector3Curve(                                                     \
670                 result,                                                         \
671                 flags,                                                          \
672                 reinterpret_cast<const ResVector3CurveData*>( ref().to##name.to_ptr() ), \
673                 0 );                                                            \
674         }                                                                       \
675         else                                                                    \
676         {                                                                       \
677             CalcVector3Curve(                                                     \
678                 result,                                                         \
679                 flags,                                                          \
680                 reinterpret_cast<const ResVector3CurveData*>( ref().to##name.to_ptr() ), \
681                 frame );                                                        \
682         }                                                                       \
683     }                                                                           \
684 
685 //! @details :private
686 class ResFloatAnim : public ResMemberAnim
687 {
688 public:
NW_RES_CTOR_INHERIT(ResFloatAnim,ResMemberAnim)689     NW_RES_CTOR_INHERIT( ResFloatAnim, ResMemberAnim )
690 
691     /* ctor */ ResFloatAnim( ResMemberAnim res )
692      : ResMemberAnim( res )
693     {
694         NW_ASSERT( (!res.IsValid()) ||
695                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_FLOAT );
696     }
697 
NW_RESANM_GETCURVE_DECL(ResFloatCurveData,Curve,ResFloatAnimData::FLAG_CONSTANT)698     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResFloatAnimData::FLAG_CONSTANT )
699 
700     f32 Evaluate( f32 frame ) const
701     {
702         if ( ref().m_Flags & ResFloatAnimData::FLAG_CONSTANT )
703         {
704             return ref().constantValue;
705         }
706         else
707         {
708             return CalcFloatCurve(
709                     reinterpret_cast<const ResFloatCurveData*>( ref().toCurve.to_ptr() ),
710                     frame );
711         }
712     }
713 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)714     bit32 EvaluateResult(
715         void* dstBuf,
716         bit32 dstFlags,
717         float frame) const
718     {
719         *reinterpret_cast<float*>(dstBuf) = Evaluate(frame);
720         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
721         return dstFlags;
722     }
723 
ApplyCache(void * target,const void * cacheBuf)724     void ApplyCache(
725         void* target,
726         const void* cacheBuf) const
727     {
728         *reinterpret_cast<float*>(target) =
729             *reinterpret_cast<const float*>(cacheBuf);
730     }
731 };
732 
733 
734 //! @details :private
735 class ResIntAnim : public ResMemberAnim
736 {
737 public:
NW_RES_CTOR_INHERIT(ResIntAnim,ResMemberAnim)738     NW_RES_CTOR_INHERIT( ResIntAnim, ResMemberAnim )
739 
740     /* ctor */ ResIntAnim( ResMemberAnim res )
741      : ResMemberAnim( res )
742     {
743         NW_ASSERT( (!res.IsValid()) ||
744                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_INT );
745     }
746 
NW_RESANM_GETCURVE_DECL(ResIntCurveData,Curve,ResIntAnimData::FLAG_CONSTANT)747     NW_RESANM_GETCURVE_DECL( ResIntCurveData, Curve, ResIntAnimData::FLAG_CONSTANT )
748 
749     s32 Evaluate( f32 frame ) const
750     {
751         if ( ref().m_Flags & ResIntAnimData::FLAG_CONSTANT )
752         {
753             return ref().constantValue;
754         }
755         else
756         {
757             return CalcIntCurve(
758                     reinterpret_cast<const ResIntCurveData*>( ref().toCurve.to_ptr() ),
759                     frame );
760         }
761     }
762 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)763     bit32 EvaluateResult(
764         void* dstBuf,
765         bit32 dstFlags,
766         float frame) const
767     {
768         *reinterpret_cast<s32*>(dstBuf) = Evaluate(frame);
769         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
770         return dstFlags;
771     }
772 
ApplyCache(void * target,const void * cacheBuf)773     void ApplyCache(
774         void* target,
775         const void* cacheBuf) const
776     {
777         *reinterpret_cast<s32*>(target) =
778             *reinterpret_cast<const s32*>(cacheBuf);
779     }
780 };
781 
782 //! @details :private
783 class ResBoolAnim : public ResMemberAnim
784 {
785 public:
NW_RES_CTOR_INHERIT(ResBoolAnim,ResMemberAnim)786     NW_RES_CTOR_INHERIT( ResBoolAnim, ResMemberAnim )
787 
788     /* ctor */ ResBoolAnim( ResMemberAnim res )
789      : ResMemberAnim( res )
790     {
791         NW_ASSERT( (!res.IsValid()) ||
792                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BOOL );
793     }
794 
NW_RESANM_GETCURVE_DECL(ResBoolCurveData,Curve,ResBoolAnimData::FLAG_CONSTANT)795     NW_RESANM_GETCURVE_DECL( ResBoolCurveData, Curve, ResBoolAnimData::FLAG_CONSTANT )
796 
797     bool Evaluate( f32 frame ) const
798     {
799         if ( ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT )
800         {
801             return (ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT_VALUE)? true : false;
802         }
803         else
804         {
805             return CalcBoolCurve(
806                     reinterpret_cast<const ResBoolCurveData*>( ref().toCurve.to_ptr() ),
807                     frame );
808         }
809     }
810 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)811     bit32 EvaluateResult(
812         void* dstBuf,
813         bit32 dstFlags,
814         float frame) const
815     {
816         *reinterpret_cast<bool*>(dstBuf) = Evaluate(frame);
817         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
818         return dstFlags;
819     }
820 
ApplyCache(void * target,const void * cacheBuf)821     void ApplyCache(
822         void* target,
823         const void* cacheBuf) const
824     {
825         *reinterpret_cast<bool*>(target) =
826             *reinterpret_cast<const bool*>(cacheBuf);
827     }
828 };
829 
830 
831 //! @details :private
832 class ResVec2Anim : public ResMemberAnim
833 {
834 public:
NW_RES_CTOR_INHERIT(ResVec2Anim,ResMemberAnim)835     NW_RES_CTOR_INHERIT( ResVec2Anim, ResMemberAnim )
836 
837     /* ctor */ ResVec2Anim( ResMemberAnim res )
838      : ResMemberAnim( res )
839     {
840         NW_ASSERT( (!res.IsValid()) ||
841                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR2 );
842     }
843 
844     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec2AnimData::FLAG_CONSTANT_X )  // GetCurveX()
845     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec2AnimData::FLAG_CONSTANT_Y )  // GetCurveY()
846 
847     NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec2AnimData::FLAG_CONSTANT_X )  // EvaluateCurveX(f32 frame)
848     NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec2AnimData::FLAG_CONSTANT_Y )  // EvaluateCurveY(f32 frame)
849 
850     bit32 EvaluateResult(
851         void* dstBuf,
852         bit32 dstFlags,
853         float frame) const;
854 
855     void ApplyCache(
856         void* target,
857         const void* cacheBuf) const;
858 };
859 
860 
861 //! @details :private
862 class ResVec3Anim : public ResMemberAnim
863 {
864 public:
NW_RES_CTOR_INHERIT(ResVec3Anim,ResMemberAnim)865     NW_RES_CTOR_INHERIT( ResVec3Anim, ResMemberAnim )
866 
867     /* ctor */ ResVec3Anim( ResMemberAnim res )
868      : ResMemberAnim( res )
869     {
870         NW_ASSERT( (!res.IsValid()) ||
871                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR3 );
872     }
873 
874     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec3AnimData::FLAG_CONSTANT_X )  // GetCurveX()
875     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec3AnimData::FLAG_CONSTANT_Y )  // GetCurveY()
876     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z )  // GetCurveZ()
877 
878     NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec3AnimData::FLAG_CONSTANT_X )  // EvaluateCurveX(f32 frame)
879     NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec3AnimData::FLAG_CONSTANT_Y )  // EvaluateCurveY(f32 frame)
880     NW_RESANM_EVALUATE_FLOAT_DECL( CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z )  // EvaluateCurveZ(f32 frame)
881 
882     bit32 EvaluateResult(
883         void* dstBuf,
884         bit32 dstFlags,
885         float frame) const;
886 
887     void ApplyCache(
888         void* target,
889         const void* cacheBuf) const;
890 };
891 
892 
893 //! @details :private
894 class ResRgbaColorAnim : public ResMemberAnim
895 {
896 public:
NW_RES_CTOR_INHERIT(ResRgbaColorAnim,ResMemberAnim)897     NW_RES_CTOR_INHERIT( ResRgbaColorAnim, ResMemberAnim )
898 
899     /* ctor */ ResRgbaColorAnim( ResMemberAnim res )
900      : ResMemberAnim( res )
901     {
902         NW_ASSERT( (!res.IsValid()) ||
903                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_RGBA_COLOR );
904     }
905 
906     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R )  // GetCurveR()
907     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G )  // GetCurveG()
908     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B )  // GetCurveB()
909     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A )  // GetCurveA()
910 
911     NW_RESANM_EVALUATE_FLOAT_DECL( CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R )  // EvaluateCurveR(f32 frame)
912     NW_RESANM_EVALUATE_FLOAT_DECL( CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G )  // EvaluateCurveG(f32 frame)
913     NW_RESANM_EVALUATE_FLOAT_DECL( CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B )  // EvaluateCurveB(f32 frame)
914     NW_RESANM_EVALUATE_FLOAT_DECL( CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A )  // EvaluateCurveA(f32 frame)
915 
916     bit32 EvaluateResult(
917         void* dstBuf,
918         bit32 dstFlags,
919         float frame) const;
920 
921     void ApplyCache(
922         void* target,
923         const void* cacheBuf) const;
924 };
925 
926 
927 //! @details :private
928 class ResTextureAnim : public ResMemberAnim
929 {
930 public:
NW_RES_CTOR_INHERIT(ResTextureAnim,ResMemberAnim)931     NW_RES_CTOR_INHERIT( ResTextureAnim, ResMemberAnim )
932 
933     /* ctor */ ResTextureAnim( ResMemberAnim res )
934      : ResMemberAnim( res )
935     {
936         NW_ASSERT( (!res.IsValid()) ||
937                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TEXTURE );
938     }
939 
940     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResTextureAnimData::FLAG_CONSTANT )  // GetCurve()
941     NW_RESANM_EVALUATE_FLOAT_DECL( Curve, ResTextureAnimData::FLAG_CONSTANT )  // EvaluateCurve(f32 frame)
942 
943     NW_RES_FIELD_CLASS_LIST_DECL( gfx::ResReferenceTexture, Textures )  // GetTexturesCount(), GetTextures(int idx), GetTextures()
944 
945     //! リソースの初期化処理をおこないます。
946     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
947 
948     //! リソースの後始末をおこないます。
949     void Cleanup();
950 
951     bit32 EvaluateResult(
952         void* dstBuf,
953         bit32 dstFlags,
954         float frame) const;
955 
956     void ApplyCache(
957         void* target,
958         const void* cacheBuf) const;
959 };
960 
961 
962 //! @details :private
963 class ResTransformAnim : public ResMemberAnim
964 {
965 public:
NW_RES_CTOR_INHERIT(ResTransformAnim,ResMemberAnim)966     NW_RES_CTOR_INHERIT( ResTransformAnim, ResMemberAnim )
967 
968     /* ctor */ ResTransformAnim( ResMemberAnim res )
969      : ResMemberAnim( res )
970     {
971         NW_ASSERT( (!res.IsValid()) ||
972                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TRANSFORM );
973     }
974 
975     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X | ResTransformAnimData::FLAG_SCALE_X_NOT_EXIST )    // GetScaleX()
976     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y | ResTransformAnimData::FLAG_SCALE_Y_NOT_EXIST )    // GetScaleY()
977     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z | ResTransformAnimData::FLAG_SCALE_Z_NOT_EXIST )    // GetScaleZ()
978     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X | ResTransformAnimData::FLAG_ROTATE_X_NOT_EXIST ) // GetRotateX()
979     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y | ResTransformAnimData::FLAG_ROTATE_Y_NOT_EXIST ) // GetRotateY()
980     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z | ResTransformAnimData::FLAG_ROTATE_Z_NOT_EXIST ) // GetRotateZ()
981     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X | ResTransformAnimData::FLAG_TRANSLATE_X_NOT_EXIST ) // GetTranslateX()
982     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y | ResTransformAnimData::FLAG_TRANSLATE_Y_NOT_EXIST ) // GetTranslateY()
983     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z | ResTransformAnimData::FLAG_TRANSLATE_Z_NOT_EXIST ) // GetTranslateZ()
984 
985     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X ) // EvaluateScaleX(f32 frame)
986     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y ) // EvaluateScaleY(f32 frame)
987     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z ) // EvaluateScaleZ(f32 frame)
988 
989     NW_RESANM_EVALUATE_FLOAT_DECL( RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X ) // EvaluateRotateX(f32 frame)
990     NW_RESANM_EVALUATE_FLOAT_DECL( RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y ) // EvaluateRotateY(f32 frame)
991     NW_RESANM_EVALUATE_FLOAT_DECL( RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z ) // EvaluateRotateZ(f32 frame)
992 
993     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X ) // EvaluateTranslateX(f32 frame)
994     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y ) // EvaluateTranslateY(f32 frame)
995     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z ) // EvaluateTranslateZ(f32 frame)
996 
997     bit32 EvaluateResult(
998         void* dstBuf,
999         bit32 dstFlags,
1000         float frame,
1001         const void* originalTransform) const;
1002 
1003     void ApplyCache(
1004         void* target,
1005         const void* cacheBuf) const;
1006 };
1007 
1008 
1009 //! @details :private
1010 class ResBakedTransformAnim : public ResMemberAnim
1011 {
1012 public:
NW_RES_CTOR_INHERIT(ResBakedTransformAnim,ResMemberAnim)1013     NW_RES_CTOR_INHERIT( ResBakedTransformAnim, ResMemberAnim )
1014 
1015     /* ctor */ ResBakedTransformAnim( ResMemberAnim res )
1016      : ResMemberAnim( res )
1017     {
1018         NW_ASSERT( (!res.IsValid()) ||
1019                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BAKED_TRANSFORM );
1020     }
1021 
1022     NW_RESANM_GETCURVE_DECL( ResVector4CurveData, Rotate, ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE | ResBakedTransformAnimData::FLAG_ROTATE_NOT_EXIST ) // GetRotate()
1023     NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Translate, ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE | ResBakedTransformAnimData::FLAG_TRANSLATE_NOT_EXIST ) // GetTranslate()
1024     NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE | ResBakedTransformAnimData::FLAG_SCALE_NOT_EXIST )     // GetScale()
1025 
NW_RESANM_EVALUATE_VEC3_DECL(Scale,ResBakedTransformAnimData::FLAG_CONSTANT_SCALE)1026     NW_RESANM_EVALUATE_VEC3_DECL( Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE )    // EvaluateScale(math::VEC3* result, f32 frame)
1027 
1028     // これらは結果書き込み先と評価カーブが一致しない特殊なもの
1029     void EvaluateRotate( math::MTX34* result, bit32* flags, f32 frame ) const
1030     {
1031         float f =
1032             ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE ) ? 0 : frame;
1033 
1034         CalcRotateCurve( result, flags, reinterpret_cast<const ResVector4CurveData*>( ref().toRotate.to_ptr() ), f );
1035     }
EvaluateTranslate(math::MTX34 * result,bit32 * flags,f32 frame)1036     void EvaluateTranslate( math::MTX34* result, bit32* flags, f32 frame ) const
1037     {
1038         float f =
1039             ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE ) ? 0 : frame;
1040 
1041         CalcTranslateCurve(result, flags, reinterpret_cast<const ResVector3CurveData*>( ref().toTranslate.to_ptr() ), f );
1042     }
1043 
1044     // データに焼き付けたフラグ情報を、CalculatedTransformに適用します。
1045     static void ApplyBakedFlags(gfx::CalculatedTransform* transform, const bit32 flags);
1046 };
1047 
1048 } /* namespace res */
1049 } /* namespace anim */
1050 } /* namespace nw */
1051 
1052 #endif /* NW_ANIM_RESANIMATION_H_ */
1053