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