1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     anim_ResAnim.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NW_ANIM_RESANIMATION_H_
19 #define NW_ANIM_RESANIMATION_H_
20 
21 #include <nw/types.h>
22 #include <nw/ut/ut_BinaryFileFormat.h>
23 #include <nw/ut/ut_ResTypes.h>
24 #include <nw/ut/ut_ResUtil.h>
25 #include <nw/ut/ut_ResDeclMacros.h>
26 #include <nw/ut/ut_ResArrayTypes.h>
27 #include <nw/anim/res/anim_ResAnimCurve.h>
28 #include <nw/anim/anim_AnimBlend.h>
29 #include <nw/gfx/gfx_Common.h>
30 #include <nw/gfx/res/gfx_ResTexture.h>
31 #include <nw/anim/res/anim_ResRevision.h>
32 
33 namespace nw {
34 
35 namespace gfx {
36 
37 class CalculatedTransform;
38 
39 namespace res {
40 
41 class ResGraphicsFile;
42 
43 } // namespace res
44 
45 } // namespace gfx
46 
47 namespace anim {
48 
49 namespace res {}
50 using namespace ::nw::anim::res;
51 
52 namespace res {
53 
54 //---------------------------------------------------------------------------
55 //! @brief        アニメーションセットのデータ構造です。
56 //---------------------------------------------------------------------------
57 //! @details :private
58 struct ResAnimData
59 {
60     enum LoopMode
61     {
62         LOOP_MODE_ONETIME,
63         LOOP_MODE_LOOP
64     };
65 
66     // メンバに変更があった場合、anim/anim_ResUtilのClone関数にも変更を適用してください。
67     ut::BinaryRevisionHeader m_Header;
68     ut::BinString   toName;
69     ut::BinString   toTargetAnimGroupName;
70     ut::ResU8       m_LoopMode;
71     u8              padding_[3];
72     ut::ResF32      m_FrameSize;
73     ut::ResS32      m_MemberAnimSetDicCount;
74     ut::Offset      toMemberAnimSetDic;
75     ut::ResS32      m_UserDataDicCount;
76     ut::Offset      toUserDataDic;
77 };
78 
79 //! @details :private
80 struct ResLightAnimData : public ResAnimData
81 {
82     enum LightType
83     {
84         LIGHT_TYPE_FRAGMENT,
85         LIGHT_TYPE_VERTEX,
86         LIGHT_TYPE_HEMISPHERE,
87         LIGHT_TYPE_AMBIENT
88     };
89 
90     // ResFragmentLight::Kindの値
91     ut::ResU32 m_LightKind;
92 
93     // LightTypeの値
94     ut::ResU32 m_LightType;
95 };
96 
97 //! @details :private
98 struct ResCameraAnimData : public ResAnimData
99 {
100     enum ProjectionUpdaterKind
101     {
102         PROJECTION_UPDATER_PERSPECTIVE,
103         PROJECTION_UPDATER_ORTHO,
104         // FRUSTUMはツール側では定義されていません。なので末尾に種類だけ定義されます。
105         PROJECTION_UPDATER_FRUSTUM
106     };
107 
108     enum ViewUpdaterKind
109     {
110         VIEW_UPDATER_AIM,
111         VIEW_UPDATER_LOOKAT,
112         VIEW_UPDATER_ROTATE
113     };
114 
115     // アニメーションが期待するProjectionUpdaterの値
116     ut::ResU32 m_ProjectionUpdaterKind;
117 
118     // アニメーションが期待するViewUpdaterの値
119     ut::ResU32 m_ViewUpdaterKind;
120 };
121 
122 //---------------------------------------------------------------------------
123 //! @brief        メンバアニメーションの情報です。
124 //---------------------------------------------------------------------------
125 //! @details :private
126 struct ResMemberAnimData
127 {
128     ut::ResU32                      m_Flags;
129     ut::BinString                   toPath;
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     //---------------------------------------------------------------------------
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 
518     //---------------------------------------------------------------------------
519     //! @fn           u32 GetPrimitiveType() const
520     //! @brief        アニメーションする要素を取得します。
521     //---------------------------------------------------------------------------
522     //---------------------------------------------------------------------------
523     //! @fn           void SetPrimitiveType(u32 primitiveType)
524     //! @brief        アニメーションする要素を設定します。
525     //---------------------------------------------------------------------------
526     NW_RES_FIELD_PRIMITIVE_DECL( u32, PrimitiveType )   // GetPrimitiveType(), SetPrimitiveType()
527     //! @}
528 
529     //! リソースの初期化処理をおこないます。
530     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
531 
532     //! リソースの後始末をおこないます。
533     void Cleanup();
534 
535     //! プリミティブのサイズをバイト数で取得します。
536     int GetPrimitiveSize() const;
537 
538     //! タイプに応じてアニメーション結果を評価します。
539     bit32 EvaluateResultForType(
540         void* dstBuf,
541         bit32 dstFlags,
542         float frame,
543         const void* originalValue) const;
544 
545     //! @brief タイプに応じてアニメーション結果のキャッシュを対象に適用します。
546     //! @details ブレンドオペレーションを使用しない場合に呼ばれます。
547     void ApplyCacheForType(
548         void* target,
549         const void* cacheBuf) const;
550 };
551 
552 typedef ut::ResArrayClass<ResMemberAnim>::type  ResMemberAnimArray; //!< @details :private
553 
554 //! @brief アニメーションのリソースクラスです。
555 //!
556 //! ResMemberAnimを束ねて、アニメーションとしてまとめます。
557 //! ループ再生の設定、フレーム数などの情報を持ちます。
558 //!
559 class ResAnim : public ut::ResCommon< ResAnimData >
560 {
561 public:
562     enum { BINARY_REVISION = REVISION_RES_ANIM_DATA };
563     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnim) };
564     enum { SIGNATURE = NW_RES_SIGNATURE32('ADAT') };
565 
566     NW_RES_CTOR( ResAnim )
567 
568     //! @name リソースへのアクセス
569     //! @{
570 
571     //---------------------------------------------------------------------------
572     //! @fn           nw::ut::BinaryRevisionHeader GetHeader()
573     //! @brief        バイナリ情報のヘッダを取得します。
574     //---------------------------------------------------------------------------
575     //---------------------------------------------------------------------------
576     //! @fn           void SetHeader(const nw::ut::BinaryRevisionHeader& header)
577     //! @brief        バイナリ情報のヘッダを設定します。
578     //! @details      :private
579     //---------------------------------------------------------------------------
NW_RES_FIELD_STRUCT_DECL(nw::ut::BinaryRevisionHeader,Header)580     NW_RES_FIELD_STRUCT_DECL( nw::ut::BinaryRevisionHeader, Header ) // GetHeader()
581 
582     //---------------------------------------------------------------------------
583     //! @brief        リビジョンを取得します。
584     //!
585     //! @return       リソースのリビジョン情報です。
586     //---------------------------------------------------------------------------
587     u32 GetRevision() const { return this->GetHeader().revision; }
588 
589     //---------------------------------------------------------------------------
590     //! @fn           const char* GetName() const
591     //! @brief        名前を取得します。
592     //---------------------------------------------------------------------------
593     NW_RES_FIELD_STRING_DECL( Name )                    // GetName()
594 
595     //---------------------------------------------------------------------------
596     //! @fn           const char* GetTargetAnimGroupName() const
597     //! @brief        アニメーションさせる AnimGroup の名前を取得します。
598     //---------------------------------------------------------------------------
599     NW_RES_FIELD_STRING_DECL( TargetAnimGroupName )     // GetTargetAnimGroupName()
600 
601     //---------------------------------------------------------------------------
602     //! @fn           u8 GetLoopMode() const
603     //! @brief        ループモードを取得します。
604     //---------------------------------------------------------------------------
605     //---------------------------------------------------------------------------
606     //! @fn           void SetLoopMode(u8 loopMode)
607     //! @brief        ループモードを設定します。
608     //---------------------------------------------------------------------------
609     NW_RES_FIELD_PRIMITIVE_DECL( u8, LoopMode )         // GetLoopMode(), SetLoopMode()
610 
611     //---------------------------------------------------------------------------
612     //! @fn           f32 GetFrameSize() const
613     //! @brief        アニメーションフレームの長さを取得します。
614     //---------------------------------------------------------------------------
615     //---------------------------------------------------------------------------
616     //! @fn           void SetFrameSize(f32 frameSize)
617     //! @brief        アニメーションフレームの長さを設定します。
618     //---------------------------------------------------------------------------
619     NW_RES_FIELD_PRIMITIVE_DECL( f32, FrameSize )       // GetFrameSize(), SetFrameSize()
620 
621     //---------------------------------------------------------------------------
622     //! @fn           s32 GetMemberAnimSetIndex(const char * key) const
623     //! @brief        メンバーアニメーションの辞書データ中でのインデックス番号を取得します。
624     //---------------------------------------------------------------------------
625     //---------------------------------------------------------------------------
626     //! @fn           s32 GetMemberAnimSetCount() const
627     //! @brief        メンバーアニメーションの要素数を取得します。
628     //---------------------------------------------------------------------------
629     //---------------------------------------------------------------------------
630     //! @fn           ResMemberAnim GetMemberAnimSet(int idx)
631     //! @brief        メンバーアニメーションを取得します。
632     //---------------------------------------------------------------------------
633     NW_RES_FIELD_CLASS_DIC_DECL( ResMemberAnim, MemberAnimSet, ut::ResDicPatricia ) // GetMemberAnimSet(int), GetMemberAnimSet(const char*), GetMemberAnimSetIndex(const char*), GetMemberAnimSetCount()
634     //---------------------------------------------------------------------------
635     //! @fn           s32 GetUserDataIndex(const char * key) const
636     //! @brief        ユーザデータの辞書データ中でのインデックス番号を取得します。
637     //---------------------------------------------------------------------------
638     //---------------------------------------------------------------------------
639     //! @fn           s32 GetUserDataCount() const
640     //! @brief        ユーザデータの要素数を取得します。
641     //---------------------------------------------------------------------------
642     //---------------------------------------------------------------------------
643     //! @fn           nw::ut::ResMetaData GetUserData(int idx)
644     //! @brief        ユーザデータを取得します。
645     //---------------------------------------------------------------------------
646     NW_RES_FIELD_CLASS_DIC_DECL( nw::ut::ResMetaData, UserData, ut::ResDicPatricia ) // GetUserData(int), GetUserData(const char*), GetUserDataIndex(const char*) GetUserDataCount()
647     //! @}
648 
649     //! リソースの初期化処理をおこないます。
650     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
651 
652     //! リソースの後始末をおこないます。
653     void Cleanup();
654 
655     //! @name リソースの生成
656     //! @{
657 
658     //! @brief 空のスケルタルアニメーションリソースを作成します。
659     //!
660     //! @param[in] allocator 生成に使用するアロケーターです。
661     //!
662     //! @return 空のスケルタルアニメーションリソースを返します。
CreateEmptySkeletalAnim(nw::os::IAllocator * allocator)663     static ResAnim CreateEmptySkeletalAnim(nw::os::IAllocator* allocator)
664     {
665         return CreateEmptyResAnim(allocator, "SkeletalAnimation");
666     }
667 
668     //! @brief 空のマテリアルアニメーションリソースを作成します。
669     //!
670     //! @param[in] allocator 生成に使用するアロケーターです。
671     //!
672     //! @return 空のマテリアルアニメーションリソースを返します。
CreateEmptyMaterialAnim(nw::os::IAllocator * allocator)673     static ResAnim CreateEmptyMaterialAnim(nw::os::IAllocator* allocator)
674     {
675         return CreateEmptyResAnim(allocator, "MaterialAnimation");
676     }
677 
678     //! @brief 空のビジビリティアニメーションリソースを作成します。
679     //!
680     //! @param[in] allocator 生成に使用するアロケーターです。
681     //!
682     //! @return 空のビジビリティアニメーションリソースを返します。
CreateEmptyVisibilityAnim(nw::os::IAllocator * allocator)683     static ResAnim CreateEmptyVisibilityAnim(nw::os::IAllocator* allocator)
684     {
685         return CreateEmptyResAnim(allocator, "VisibilityAnimation");
686     }
687 
688     //! @brief 空のカメラアニメーションリソースを作成します。
689     //!
690     //! @param[in] allocator 生成に使用するアロケーターです。
691     //!
692     //! @return 空のカメラアニメーションリソースを返します。
CreateEmptyCameraAnim(nw::os::IAllocator * allocator)693     static ResAnim CreateEmptyCameraAnim(nw::os::IAllocator* allocator)
694     {
695         return CreateEmptyResAnim(allocator, "CameraAnimation");
696     }
697 
698     //! @brief 空のライトアニメーションリソースを作成します。
699     //!
700     //! @param[in] allocator 生成に使用するアロケーターです。
701     //!
702     //! @return 空のライトアニメーションリソースを返します。
CreateEmptyLightAnim(nw::os::IAllocator * allocator)703     static ResAnim CreateEmptyLightAnim(nw::os::IAllocator* allocator)
704     {
705         return CreateEmptyResAnim(allocator, "LightAnimation");
706     }
707 
708     //! フルベイクアニメーションデータかどうかを取得します。
709     bool IsFullBakedAnim() const;
710 
711     //! @}
712 private:
713     static ResAnim CreateEmptyResAnim(nw::os::IAllocator* allocator, const char* targetAnimGroupName);
714 };
715 
716 //! @details :private
717 class ResLightAnim : public ResAnim
718 {
719 public:
720     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightAnim) };
721     enum { SIGNATURE = NW_RES_SIGNATURE32('ADLT') };
722 
723     NW_RES_CTOR_INHERIT( ResLightAnim, ResAnim )
724 
725     NW_RES_FIELD_PRIMITIVE_DECL( u32, LightKind ) // GetLightKind(), SetLightKind()
726     NW_RES_FIELD_PRIMITIVE_DECL( u32, LightType ) // GetLightType(), SetLightType()
727 };
728 
729 //! @details :private
730 class ResCameraAnim : public ResAnim
731 {
732 public:
733     enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResCameraAnim) };
734     enum { SIGNATURE = NW_RES_SIGNATURE32('ADCM') };
735 
736     NW_RES_CTOR_INHERIT( ResCameraAnim, ResAnim )
737 
738     NW_RES_FIELD_PRIMITIVE_DECL( u32, ProjectionUpdaterKind ) // GetProjectionUpdaterKind(), SetProjectionUpdaterKind()
739     NW_RES_FIELD_PRIMITIVE_DECL( u32, ViewUpdaterKind ) // GetViewUpdaterKind(), SetViewUpdaterKind()
740 };
741 
742 #define NW_RESANM_GETCURVE_DECL( type, name, hasNoCurveFlag )                   \
743     const type* Get##name() const                                               \
744     {                                                                           \
745         if ( ref().m_Flags & (hasNoCurveFlag) )                                 \
746         {                                                                       \
747             return NULL;                                                        \
748         }                                                                       \
749         else                                                                    \
750         {                                                                       \
751             return reinterpret_cast<const type*>( ref().to##name.to_ptr() );    \
752         }                                                                       \
753     }                                                                           \
754                                                                                 \
755     type* Get##name()                                                           \
756     {                                                                           \
757         if ( ref().m_Flags & (hasNoCurveFlag) )                                 \
758         {                                                                       \
759             return NULL;                                                        \
760         }                                                                       \
761         else                                                                    \
762         {                                                                       \
763             return reinterpret_cast<type*>( ref().to##name.to_ptr() );          \
764         }                                                                       \
765     }                                                                           \
766 
767 
768 #define NW_RESANM_EVALUATE_FLOAT_DECL(name, constantFlag)                       \
769     f32 Evaluate##name( f32 frame ) const                                       \
770     {                                                                           \
771         if ( ref().m_Flags & (constantFlag) )                                   \
772         {                                                                       \
773             return ref().constantValue##name;                                   \
774         }                                                                       \
775         else                                                                    \
776         {                                                                       \
777             return CalcFloatCurve(                                              \
778                     reinterpret_cast<const ResFloatCurveData*>( ref().to##name.to_ptr() ), \
779                     frame );                                                    \
780         }                                                                       \
781     }                                                                           \
782 
783 
784 #define NW_RESANM_EVALUATE_INT_DECL(name, constantFlag)                         \
785     s32 Evaluate##name( f32 frame ) const                                       \
786     {                                                                           \
787         if ( ref().m_Flags & (constantFlag) )                                   \
788         {                                                                       \
789             return ref().constantValue##name;                                   \
790         }                                                                       \
791         else                                                                    \
792         {                                                                       \
793             return CalcIntCurve(                                                \
794                     reinterpret_cast<const ResIntCurveData*>( ref().to##name.to_ptr() ), \
795                     frame );                                                    \
796         }                                                                       \
797     }                                                                           \
798 
799 
800 #define NW_RESANM_EVALUATE_VEC3_DECL(name, constantFlag)                        \
801     void Evaluate##name( math::VEC3* result, bit32* flags, f32 frame ) const    \
802     {                                                                           \
803         if ( ref().m_Flags & (constantFlag) )                                   \
804         {                                                                       \
805             CalcVector3Curve(                                                     \
806                 result,                                                         \
807                 flags,                                                          \
808                 reinterpret_cast<const ResVector3CurveData*>( ref().to##name.to_ptr() ), \
809                 0 );                                                            \
810         }                                                                       \
811         else                                                                    \
812         {                                                                       \
813             CalcVector3Curve(                                                     \
814                 result,                                                         \
815                 flags,                                                          \
816                 reinterpret_cast<const ResVector3CurveData*>( ref().to##name.to_ptr() ), \
817                 frame );                                                        \
818         }                                                                       \
819     }                                                                           \
820 
821 //! @details :private
822 class ResFloatAnim : public ResMemberAnim
823 {
824 public:
NW_RES_CTOR_INHERIT(ResFloatAnim,ResMemberAnim)825     NW_RES_CTOR_INHERIT( ResFloatAnim, ResMemberAnim )
826 
827     /* ctor */ ResFloatAnim( ResMemberAnim res )
828      : ResMemberAnim( res )
829     {
830         NW_ASSERT( (!res.IsValid()) ||
831                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_FLOAT );
832     }
833 
NW_RESANM_GETCURVE_DECL(ResFloatCurveData,Curve,ResFloatAnimData::FLAG_CONSTANT)834     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResFloatAnimData::FLAG_CONSTANT )
835 
836     f32 Evaluate( f32 frame ) const
837     {
838         if ( ref().m_Flags & ResFloatAnimData::FLAG_CONSTANT )
839         {
840             return ref().constantValue;
841         }
842         else
843         {
844             return CalcFloatCurve(
845                     reinterpret_cast<const ResFloatCurveData*>( ref().toCurve.to_ptr() ),
846                     frame );
847         }
848     }
849 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)850     bit32 EvaluateResult(
851         void* dstBuf,
852         bit32 dstFlags,
853         float frame) const
854     {
855         *reinterpret_cast<float*>(dstBuf) = Evaluate(frame);
856         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
857         return dstFlags;
858     }
859 
ApplyCache(void * target,const void * cacheBuf)860     void ApplyCache(
861         void* target,
862         const void* cacheBuf) const
863     {
864         *reinterpret_cast<float*>(target) =
865             *reinterpret_cast<const float*>(cacheBuf);
866     }
867 };
868 
869 
870 //! @details :private
871 class ResIntAnim : public ResMemberAnim
872 {
873 public:
NW_RES_CTOR_INHERIT(ResIntAnim,ResMemberAnim)874     NW_RES_CTOR_INHERIT( ResIntAnim, ResMemberAnim )
875 
876     /* ctor */ ResIntAnim( ResMemberAnim res )
877      : ResMemberAnim( res )
878     {
879         NW_ASSERT( (!res.IsValid()) ||
880                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_INT );
881     }
882 
NW_RESANM_GETCURVE_DECL(ResIntCurveData,Curve,ResIntAnimData::FLAG_CONSTANT)883     NW_RESANM_GETCURVE_DECL( ResIntCurveData, Curve, ResIntAnimData::FLAG_CONSTANT )
884 
885     s32 Evaluate( f32 frame ) const
886     {
887         if ( ref().m_Flags & ResIntAnimData::FLAG_CONSTANT )
888         {
889             return ref().constantValue;
890         }
891         else
892         {
893             return CalcIntCurve(
894                     reinterpret_cast<const ResIntCurveData*>( ref().toCurve.to_ptr() ),
895                     frame );
896         }
897     }
898 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)899     bit32 EvaluateResult(
900         void* dstBuf,
901         bit32 dstFlags,
902         float frame) const
903     {
904         *reinterpret_cast<s32*>(dstBuf) = Evaluate(frame);
905         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
906         return dstFlags;
907     }
908 
ApplyCache(void * target,const void * cacheBuf)909     void ApplyCache(
910         void* target,
911         const void* cacheBuf) const
912     {
913         *reinterpret_cast<s32*>(target) =
914             *reinterpret_cast<const s32*>(cacheBuf);
915     }
916 };
917 
918 //! @details :private
919 class ResBoolAnim : public ResMemberAnim
920 {
921 public:
NW_RES_CTOR_INHERIT(ResBoolAnim,ResMemberAnim)922     NW_RES_CTOR_INHERIT( ResBoolAnim, ResMemberAnim )
923 
924     /* ctor */ ResBoolAnim( ResMemberAnim res )
925      : ResMemberAnim( res )
926     {
927         NW_ASSERT( (!res.IsValid()) ||
928                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BOOL );
929     }
930 
NW_RESANM_GETCURVE_DECL(ResBoolCurveData,Curve,ResBoolAnimData::FLAG_CONSTANT)931     NW_RESANM_GETCURVE_DECL( ResBoolCurveData, Curve, ResBoolAnimData::FLAG_CONSTANT )
932 
933     bool Evaluate( f32 frame ) const
934     {
935         if ( ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT )
936         {
937             return (ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT_VALUE)? true : false;
938         }
939         else
940         {
941             return CalcBoolCurve(
942                     reinterpret_cast<const ResBoolCurveData*>( ref().toCurve.to_ptr() ),
943                     frame );
944         }
945     }
946 
EvaluateResult(void * dstBuf,bit32 dstFlags,float frame)947     bit32 EvaluateResult(
948         void* dstBuf,
949         bit32 dstFlags,
950         float frame) const
951     {
952         *reinterpret_cast<bool*>(dstBuf) = Evaluate(frame);
953         dstFlags |= AnimResult::FLAG_VALID_COMPONENT0;
954         return dstFlags;
955     }
956 
ApplyCache(void * target,const void * cacheBuf)957     void ApplyCache(
958         void* target,
959         const void* cacheBuf) const
960     {
961         *reinterpret_cast<bool*>(target) =
962             *reinterpret_cast<const bool*>(cacheBuf);
963     }
964 };
965 
966 
967 //! @details :private
968 class ResVec2Anim : public ResMemberAnim
969 {
970 public:
NW_RES_CTOR_INHERIT(ResVec2Anim,ResMemberAnim)971     NW_RES_CTOR_INHERIT( ResVec2Anim, ResMemberAnim )
972 
973     /* ctor */ ResVec2Anim( ResMemberAnim res )
974      : ResMemberAnim( res )
975     {
976         NW_ASSERT( (!res.IsValid()) ||
977                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR2 );
978     }
979 
980     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec2AnimData::FLAG_CONSTANT_X )  // GetCurveX()
981     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec2AnimData::FLAG_CONSTANT_Y )  // GetCurveY()
982 
983     NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec2AnimData::FLAG_CONSTANT_X )  // EvaluateCurveX(f32 frame)
984     NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec2AnimData::FLAG_CONSTANT_Y )  // EvaluateCurveY(f32 frame)
985 
986     bit32 EvaluateResult(
987         void* dstBuf,
988         bit32 dstFlags,
989         float frame) const;
990 
991     void ApplyCache(
992         void* target,
993         const void* cacheBuf) const;
994 };
995 
996 
997 //! @details :private
998 class ResVec3Anim : public ResMemberAnim
999 {
1000 public:
NW_RES_CTOR_INHERIT(ResVec3Anim,ResMemberAnim)1001     NW_RES_CTOR_INHERIT( ResVec3Anim, ResMemberAnim )
1002 
1003     /* ctor */ ResVec3Anim( ResMemberAnim res )
1004      : ResMemberAnim( res )
1005     {
1006         NW_ASSERT( (!res.IsValid()) ||
1007                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR3 );
1008     }
1009 
1010     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec3AnimData::FLAG_CONSTANT_X )  // GetCurveX()
1011     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec3AnimData::FLAG_CONSTANT_Y )  // GetCurveY()
1012     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z )  // GetCurveZ()
1013 
1014     NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec3AnimData::FLAG_CONSTANT_X )  // EvaluateCurveX(f32 frame)
1015     NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec3AnimData::FLAG_CONSTANT_Y )  // EvaluateCurveY(f32 frame)
1016     NW_RESANM_EVALUATE_FLOAT_DECL( CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z )  // EvaluateCurveZ(f32 frame)
1017 
1018     bit32 EvaluateResult(
1019         void* dstBuf,
1020         bit32 dstFlags,
1021         float frame) const;
1022 
1023     void ApplyCache(
1024         void* target,
1025         const void* cacheBuf) const;
1026 };
1027 
1028 
1029 //! @details :private
1030 class ResRgbaColorAnim : public ResMemberAnim
1031 {
1032 public:
NW_RES_CTOR_INHERIT(ResRgbaColorAnim,ResMemberAnim)1033     NW_RES_CTOR_INHERIT( ResRgbaColorAnim, ResMemberAnim )
1034 
1035     /* ctor */ ResRgbaColorAnim( ResMemberAnim res )
1036      : ResMemberAnim( res )
1037     {
1038         NW_ASSERT( (!res.IsValid()) ||
1039                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_RGBA_COLOR );
1040     }
1041 
1042     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R )  // GetCurveR()
1043     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G )  // GetCurveG()
1044     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B )  // GetCurveB()
1045     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A )  // GetCurveA()
1046 
1047     NW_RESANM_EVALUATE_FLOAT_DECL( CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R )  // EvaluateCurveR(f32 frame)
1048     NW_RESANM_EVALUATE_FLOAT_DECL( CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G )  // EvaluateCurveG(f32 frame)
1049     NW_RESANM_EVALUATE_FLOAT_DECL( CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B )  // EvaluateCurveB(f32 frame)
1050     NW_RESANM_EVALUATE_FLOAT_DECL( CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A )  // EvaluateCurveA(f32 frame)
1051 
1052     bit32 EvaluateResult(
1053         void* dstBuf,
1054         bit32 dstFlags,
1055         float frame) const;
1056 
1057     void ApplyCache(
1058         void* target,
1059         const void* cacheBuf) const;
1060 };
1061 
1062 
1063 //! @details :private
1064 class ResTextureAnim : public ResMemberAnim
1065 {
1066 public:
NW_RES_CTOR_INHERIT(ResTextureAnim,ResMemberAnim)1067     NW_RES_CTOR_INHERIT( ResTextureAnim, ResMemberAnim )
1068 
1069     /* ctor */ ResTextureAnim( ResMemberAnim res )
1070      : ResMemberAnim( res )
1071     {
1072         NW_ASSERT( (!res.IsValid()) ||
1073                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TEXTURE );
1074     }
1075 
1076     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResTextureAnimData::FLAG_CONSTANT )  // GetCurve()
1077     NW_RESANM_EVALUATE_FLOAT_DECL( Curve, ResTextureAnimData::FLAG_CONSTANT )  // EvaluateCurve(f32 frame)
1078 
1079     NW_RES_FIELD_CLASS_LIST_DECL( gfx::ResReferenceTexture, Textures )  // GetTexturesCount(), GetTextures(int idx), GetTextures()
1080 
1081     //! リソースの初期化処理をおこないます。
1082     gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile);
1083 
1084     //! リソースの後始末をおこないます。
1085     void Cleanup();
1086 
1087     bit32 EvaluateResult(
1088         void* dstBuf,
1089         bit32 dstFlags,
1090         float frame) const;
1091 
1092     void ApplyCache(
1093         void* target,
1094         const void* cacheBuf) const;
1095 };
1096 
1097 
1098 //! @details :private
1099 class ResTransformAnim : public ResMemberAnim
1100 {
1101 public:
NW_RES_CTOR_INHERIT(ResTransformAnim,ResMemberAnim)1102     NW_RES_CTOR_INHERIT( ResTransformAnim, ResMemberAnim )
1103 
1104     /* ctor */ ResTransformAnim( ResMemberAnim res )
1105      : ResMemberAnim( res )
1106     {
1107         NW_ASSERT( (!res.IsValid()) ||
1108                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TRANSFORM );
1109     }
1110 
1111     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X | ResTransformAnimData::FLAG_SCALE_X_NOT_EXIST )    // GetScaleX()
1112     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y | ResTransformAnimData::FLAG_SCALE_Y_NOT_EXIST )    // GetScaleY()
1113     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z | ResTransformAnimData::FLAG_SCALE_Z_NOT_EXIST )    // GetScaleZ()
1114     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X | ResTransformAnimData::FLAG_ROTATE_X_NOT_EXIST ) // GetRotateX()
1115     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y | ResTransformAnimData::FLAG_ROTATE_Y_NOT_EXIST ) // GetRotateY()
1116     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z | ResTransformAnimData::FLAG_ROTATE_Z_NOT_EXIST ) // GetRotateZ()
1117     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X | ResTransformAnimData::FLAG_TRANSLATE_X_NOT_EXIST ) // GetTranslateX()
1118     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y | ResTransformAnimData::FLAG_TRANSLATE_Y_NOT_EXIST ) // GetTranslateY()
1119     NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z | ResTransformAnimData::FLAG_TRANSLATE_Z_NOT_EXIST ) // GetTranslateZ()
1120 
1121     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X ) // EvaluateScaleX(f32 frame)
1122     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y ) // EvaluateScaleY(f32 frame)
1123     NW_RESANM_EVALUATE_FLOAT_DECL( ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z ) // EvaluateScaleZ(f32 frame)
1124 
1125     NW_RESANM_EVALUATE_FLOAT_DECL( RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X ) // EvaluateRotateX(f32 frame)
1126     NW_RESANM_EVALUATE_FLOAT_DECL( RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y ) // EvaluateRotateY(f32 frame)
1127     NW_RESANM_EVALUATE_FLOAT_DECL( RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z ) // EvaluateRotateZ(f32 frame)
1128 
1129     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X ) // EvaluateTranslateX(f32 frame)
1130     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y ) // EvaluateTranslateY(f32 frame)
1131     NW_RESANM_EVALUATE_FLOAT_DECL( TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z ) // EvaluateTranslateZ(f32 frame)
1132 
1133     bit32 EvaluateResult(
1134         void* dstBuf,
1135         bit32 dstFlags,
1136         float frame,
1137         const void* originalTransform) const;
1138 
1139     void ApplyCache(
1140         void* target,
1141         const void* cacheBuf) const;
1142 };
1143 
1144 
1145 //! @details :private
1146 class ResBakedTransformAnim : public ResMemberAnim
1147 {
1148 public:
NW_RES_CTOR_INHERIT(ResBakedTransformAnim,ResMemberAnim)1149     NW_RES_CTOR_INHERIT( ResBakedTransformAnim, ResMemberAnim )
1150 
1151     /* ctor */ ResBakedTransformAnim( ResMemberAnim res )
1152      : ResMemberAnim( res )
1153     {
1154         NW_ASSERT( (!res.IsValid()) ||
1155                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BAKED_TRANSFORM );
1156     }
1157 
1158     NW_RESANM_GETCURVE_DECL( ResVector4CurveData, Rotate, ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE | ResBakedTransformAnimData::FLAG_ROTATE_NOT_EXIST ) // GetRotate()
1159     NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Translate, ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE | ResBakedTransformAnimData::FLAG_TRANSLATE_NOT_EXIST ) // GetTranslate()
1160     NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE | ResBakedTransformAnimData::FLAG_SCALE_NOT_EXIST )     // GetScale()
1161 
NW_RESANM_EVALUATE_VEC3_DECL(Scale,ResBakedTransformAnimData::FLAG_CONSTANT_SCALE)1162     NW_RESANM_EVALUATE_VEC3_DECL( Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE )    // EvaluateScale(math::VEC3* result, f32 frame)
1163 
1164     // これらは結果書き込み先と評価カーブが一致しない特殊なもの
1165     void EvaluateRotate( math::MTX34* result, bit32* flags, f32 frame ) const
1166     {
1167         float f =
1168             ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE ) ? 0 : frame;
1169 
1170         CalcRotateCurve( result, flags, reinterpret_cast<const ResVector4CurveData*>( ref().toRotate.to_ptr() ), f );
1171     }
EvaluateTranslate(math::MTX34 * result,bit32 * flags,f32 frame)1172     void EvaluateTranslate( math::MTX34* result, bit32* flags, f32 frame ) const
1173     {
1174         float f =
1175             ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE ) ? 0 : frame;
1176 
1177         CalcTranslateCurve(result, flags, reinterpret_cast<const ResVector3CurveData*>( ref().toTranslate.to_ptr() ), f );
1178     }
1179 
1180     // データに焼き付けたフラグ情報を、CalculatedTransformに適用します。
1181     static void ApplyBakedFlags(gfx::CalculatedTransform* transform, const bit32 flags);
1182 };
1183 
1184 
1185 //! @details :private
1186 class ResFullBakedAnim : public ResMemberAnim
1187 {
1188 public:
NW_RES_CTOR_INHERIT(ResFullBakedAnim,ResMemberAnim)1189     NW_RES_CTOR_INHERIT( ResFullBakedAnim, ResMemberAnim )
1190 
1191     /* ctor */ ResFullBakedAnim( ResMemberAnim res )
1192      : ResMemberAnim( res )
1193     {
1194         NW_ASSERT( (!res.IsValid()) ||
1195                     res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_FULL_BAKED );
1196     }
1197 
GetTransform()1198     const ResFullBakedCurveData* GetTransform() const
1199     {
1200         return reinterpret_cast<const ResFullBakedCurveData*>( ref().toTransform.to_ptr() );
1201     }
1202 
GetTransform()1203     ResFullBakedCurveData* GetTransform()
1204     {
1205         return reinterpret_cast<ResFullBakedCurveData*>( ref().toTransform.to_ptr() );
1206     }
1207 
EvaluateTransform(math::MTX34 * result,f32 frame)1208     void EvaluateTransform( math::MTX34* result, f32 frame ) const
1209     {
1210         CalcTransformCurve( result, GetTransform(), frame );
1211     }
1212 };
1213 
1214 } /* namespace res */
1215 } /* namespace anim */
1216 } /* namespace nw */
1217 
1218 #endif /* NW_ANIM_RESANIMATION_H_ */
1219