1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     anim_AnimBlend.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: 22716 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_ANIM_ANIMBLEND_H_
17 #define NW_ANIM_ANIMBLEND_H_
18 
19 #include <nw/types.h>
20 #include <nw/ut/ut_Flag.h>
21 #include <nw/gfx/gfx_CalculatedTransform.h>
22 
23 namespace nw {
24 namespace anim {
25 
26 //---------------------------------------------------------------------------
27 //! @brief アニメーション結果のクラスです。
28 //---------------------------------------------------------------------------
29 class AnimResult
30 {
31 public:
32     //! フラグの定義です。
33     enum Flags
34     {
35         FLAG_VALID_COMPONENT0_SHIFT = 0, //!< @details :private
36         FLAG_VALID_COMPONENT1_SHIFT = 1, //!< @details :private
37         FLAG_VALID_COMPONENT2_SHIFT = 2, //!< @details :private
38         FLAG_VALID_COMPONENT3_SHIFT = 3, //!< @details :private
39         FLAG_CONVERTED_SHIFT = 30, //!< @details :private
40 
41         //! 0 番目の成分のアニメーションが有効なら 1 となります。
42         FLAG_VALID_COMPONENT0 = 0x1 << FLAG_VALID_COMPONENT0_SHIFT,
43 
44         //! 1 番目の成分のアニメーションが有効なら 1 となります。
45         FLAG_VALID_COMPONENT1 = 0x1 << FLAG_VALID_COMPONENT1_SHIFT,
46 
47         //! 2 番目の成分のアニメーションが有効なら 1 となります。
48         FLAG_VALID_COMPONENT2 = 0x1 << FLAG_VALID_COMPONENT2_SHIFT,
49 
50         //! 3 番目の成分のアニメーションが有効なら 1 となります。
51         FLAG_VALID_COMPONENT3 = 0x1 << FLAG_VALID_COMPONENT3_SHIFT,
52 
53         //! 操作空間に変換されていれば 1 となります。
54         FLAG_CONVERTED = 0x1 << FLAG_CONVERTED_SHIFT
55     };
56 
57     //! 最大成分数です。
58     enum { MAX_COMPONENTS = 4 };
59 
60     //----------------------------------------
61     //! @name コンストラクタ/デストラクタ
62     //@{
63 
64     //! コンストラクタです。
AnimResult()65     AnimResult()
66     : m_Flags(0) {}
67 
68     //! デストラクタです。
~AnimResult()69     virtual ~AnimResult() {}
70 
71     //@}
72 
73     //----------------------------------------
74     //! @name 取得/設定
75     //@{
76 
77     //! フラグの値を直接取得します。
GetFlags()78     bit32 GetFlags() const { return m_Flags; }
79 
80     //! フラグの値を直接設定します。
SetFlags(bit32 flags)81     void SetFlags(bit32 flags) { m_Flags = flags; }
82 
83     //! フラグが有効になっているか取得します。
IsEnabledFlags(bit32 flags)84     bool IsEnabledFlags(bit32 flags) const { return ut::CheckFlag(m_Flags, flags); }
85 
86     //! フラグを有効に設定します。
EnableFlags(bit32 flags)87     void EnableFlags(bit32 flags) { m_Flags = ut::EnableFlag(m_Flags, flags); }
88 
89     //! フラグを無効に設定します。
DisableFlags(bit32 flags)90     void DisableFlags(bit32 flags) { m_Flags = ut::DisableFlag(m_Flags, flags); }
91 
92     //! フラグの有効/無効を設定します。
EnableFlags(bit32 flags,bool enable)93     void EnableFlags(bit32 flags, bool enable)
94     {
95         if (enable)
96         {
97             m_Flags |= flags;
98         }
99         else
100         {
101             m_Flags &= ~flags;
102         }
103     }
104 
105     //! 全てのフラグを無効に設定します。
ResetFlags()106     void ResetFlags() { m_Flags = 0; }
107 
108     //! 値バッファを取得します。
GetValueBuffer()109     const void* GetValueBuffer() const { return m_ValueBuf; }
110 
111     //! 値バッファを取得します。
GetValueBuffer()112     void* GetValueBuffer() { return m_ValueBuf; }
113 
114     //! オブジェクトの先頭から値バッファまでのオフセットをバイト数で取得します。
GetOffsetToValueBuffer()115     int GetOffsetToValueBuffer() const
116     {
117         return reinterpret_cast<const u8*>(GetValueBuffer()) -
118             reinterpret_cast<const u8*>(this);
119     }
120 
121     //@}
122 
123 private:
124     bit32 m_Flags;
125 
126     // ResMemberAnim::GetPrimitiveSize() の最大値以上のサイズの領域
127     float m_ValueBuf[(sizeof(gfx::CalculatedTransform) + sizeof(float) - 1) / sizeof(float)];
128 };
129 
130 //---------------------------------------------------------------------------
131 //! @brief アニメーションのブレンドオペレーションの基底クラスです。
132 //---------------------------------------------------------------------------
133 class AnimBlendOp
134 {
135 public:
136     //! 基本ブレンド処理用のフラグの定義です。
137     //!
138     //! :private
139     enum Flags
140     {
141         VALID_SINGLE = AnimResult::FLAG_VALID_COMPONENT0,
142 
143         VALID_X = AnimResult::FLAG_VALID_COMPONENT0,
144         VALID_Y = AnimResult::FLAG_VALID_COMPONENT1,
145         VALID_Z = AnimResult::FLAG_VALID_COMPONENT2,
146         VALID_W = AnimResult::FLAG_VALID_COMPONENT3,
147         VALID_XY   = VALID_X | VALID_Y,
148         VALID_XYZ  = VALID_X | VALID_Y | VALID_Z,
149         VALID_XYZW = VALID_X | VALID_Y | VALID_Z | VALID_W,
150 
151         VALID_R = AnimResult::FLAG_VALID_COMPONENT0,
152         VALID_G = AnimResult::FLAG_VALID_COMPONENT1,
153         VALID_B = AnimResult::FLAG_VALID_COMPONENT2,
154         VALID_A = AnimResult::FLAG_VALID_COMPONENT3,
155         VALID_RGBA = VALID_R | VALID_G | VALID_B | VALID_A,
156 
157         CONVERTED = AnimResult::FLAG_CONVERTED
158     };
159 
160     //----------------------------------------
161     //! @name コンストラクタ/デストラクタ
162     //@{
163 
164     //! @brief コンストラクタです。
165     //!
166     //! @param[in] hasBlend ブレンド処理があるかどうかです。
167     //! @param[in] hasPostBlend ブレンド後の処理があるかどうかです。
168     //!
AnimBlendOp(bool hasBlend,bool hasPostBlend)169     AnimBlendOp(bool hasBlend, bool hasPostBlend)
170     : m_HasBlend(hasBlend),
171       m_HasPostBlend(hasPostBlend) {}
172 
173     //! デストラクタです。
~AnimBlendOp()174     virtual ~AnimBlendOp() {}
175 
176     //@}
177 
178     //----------------------------------------
179     //! @name 取得/設定
180     //@{
181 
182     //! @brief ブレンド処理があるかどうかを取得します。
183     //!
184     //! @return ブレンド処理があるなら true を返します。
185     //!
HasBlend()186     bool HasBlend() const { return m_HasBlend; }
187 
188     //! @brief ブレンド後の処理があるかどうかを取得します。
189     //!
190     //! @return ブレンド後の処理があるなら true を返します。
191     //!
HasPostBlend()192     bool HasPostBlend() const { return m_HasPostBlend; }
193 
194     //@}
195 
196     //----------------------------------------
197     //! @name ブレンド
198     //@{
199 
200     //! @brief ブレンド処理を行います。
201     //!
202     //! @param[in,out] dst ブレンド処理結果です。
203     //! @param[in,out] dstWeights ブレンド処理結果の成分ごとの重みの累積値です。
204     //! 成分ごとの重みの累積値で再正規化を行う必要がなければ NULL を指定します。
205     //! @param[in] src ブレンド処理の入力です。
206     //! @param[in] srcWeights ブレンド処理の入力の重みです。
207     //! ブレンドオペレーションによって、全成分で共通の場合と、成分ごとに異なる場合があります。
208     //!
209     //! @return ブレンド処理のループを継続するなら true を返します。
210     //!
Blend(AnimResult * dst,float * dstWeights,const AnimResult * src,const float * srcWeights)211     virtual bool Blend(
212         AnimResult* dst,
213         float* dstWeights,
214         const AnimResult* src,
215         const float* srcWeights) const
216     {
217         (void)dst;
218         (void)dstWeights;
219         (void)src;
220         (void)srcWeights;
221         return true;
222     }
223 
224     //! @brief ブレンド後の処理を行います。
225     //!
226     //! @param[in,out] result ブレンド処理結果です。
227     //! @param[in] weights ブレンド処理結果の成分ごとの重みの累積値です。
228     //! 成分ごとの重みの累積値で再正規化を行う必要がなければ NULL を指定します。
229     //!
230     //! @return 成功すれば true を返します。
231     //!
PostBlend(AnimResult * result,const float * weights)232     virtual bool PostBlend(AnimResult* result, const float* weights) const
233     {
234         (void)result;
235         (void)weights;
236         return true;
237     };
238 
239     //! @brief 上書き処理を行います。
240     //!
241     //! @param[in,out] dst ブレンド処理結果です。
242     //! @param[in] src ブレンド処理の入力です。
243     //!
244     //! @return すべての成分が上書きされたら true を返します。
245     //!
246     virtual bool Override(AnimResult* dst, const AnimResult* src) const = 0;
247 
248     //@}
249 
250     //----------------------------------------
251     //! @name 適用
252     //@{
253 
254     //! @brief ブレンド処理結果を対象に適用します。
255     //!
256     //! @param[out] target ブレンド処理結果を適用する対象です。
257     //! @param[in] result ブレンド処理結果です。
258     //!
259     virtual void Apply(void* target, const AnimResult* result) const = 0;
260 
261     //! @brief 対象を AnimResult に変換します。
262     //!
263     //! @param[out] result 出力の AnimResult です。
264     //! @param[in] source 変換元へのポインタです。
265     //!
266     //! :private
267     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const = 0;
268 
269     //@}
270 
271 protected:
272     //----------------------------------------
273     //! @name 基本ブレンド処理
274     //@{
275 
276     //! FloatVector のブレンド処理を行います。
277     //!
278     //! :private
279     bool BlendFloatVector(
280         AnimResult* dst,
281         const AnimResult* src,
282         float srcWeight,
283         int compCount
284     ) const;
285 
286     //! FloatVector の上書き処理を行います。
287     //!
288     //! :private
289     bool OverrideFloatVector(
290         AnimResult* dst,
291         const AnimResult* src,
292         int compCount,
293         bit32 allCompValidFlag
294     ) const;
295 
296     //@}
297 
298     //----------------------------------------
299     //! @name 基本適用処理
300     //@{
301 
302     //! FloatVector のブレンド処理結果を対象に適用します。
303     //!
304     //! :private
305     void ApplyFloatVector(void* target, const AnimResult* result, int compCount) const;
306 
307     //! @brief FloatVector を AnimResult に変換します。
308     //!
309     //! @param[out] result 出力の AnimResult です。
310     //! @param[in] source 変換元へのポインタです。
311     //!
312     //! :private
313     void ConvertFloatVectorToAnimResult(AnimResult* result, const void* source, int compCount) const;
314 
315 
316     //@}
317 
318 private:
319     bool m_HasBlend;
320     bool m_HasPostBlend;
321 };
322 
323 //---------------------------------------------------------------------------
324 //! @brief bool アニメーションのブレンドオペレーションのクラスです。
325 //---------------------------------------------------------------------------
326 class AnimBlendOpBool : public AnimBlendOp
327 {
328 public:
329     //----------------------------------------
330     //! @name コンストラクタ/デストラクタ
331     //@{
332 
333     //! コンストラクタです。
AnimBlendOpBool()334     AnimBlendOpBool()
335     : AnimBlendOp(true, false) {}
336 
337     //! デストラクタです。
~AnimBlendOpBool()338     virtual ~AnimBlendOpBool() {}
339 
340     //@}
341 
342     //----------------------------------------
343     //! @name ブレンド
344     //@{
345 
346     virtual bool Blend(
347         AnimResult* dst,
348         float* dstWeights,
349         const AnimResult* src,
350         const float* srcWeights) const;
351 
Override(AnimResult * dst,const AnimResult * src)352     virtual bool Override(AnimResult* dst, const AnimResult* src) const
353     {
354         *reinterpret_cast<bool*>(dst->GetValueBuffer()) =
355             *reinterpret_cast<const bool*>(src->GetValueBuffer());
356         dst->SetFlags(VALID_SINGLE);
357         return true;
358     }
359 
360     //@}
361 
362     //----------------------------------------
363     //! @name 適用
364     //@{
365 
Apply(void * target,const AnimResult * result)366     virtual void Apply(void* target, const AnimResult* result) const
367     {
368         *reinterpret_cast<bool*>(target) =
369             *reinterpret_cast<const bool*>(result->GetValueBuffer());
370     }
371 
ConvertToAnimResult(AnimResult * result,const void * source)372     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
373     {
374         *reinterpret_cast<bool*>(result->GetValueBuffer()) =
375             *reinterpret_cast<const bool*>(source);
376         result->SetFlags(VALID_SINGLE);
377     }
378 
379 
380     //@}
381 };
382 
383 //---------------------------------------------------------------------------
384 //! @brief int アニメーションのブレンドオペレーションのクラスです。
385 //---------------------------------------------------------------------------
386 class AnimBlendOpInt : public AnimBlendOp
387 {
388 public:
389     //----------------------------------------
390     //! @name コンストラクタ/デストラクタ
391     //@{
392 
393     //! コンストラクタです。
AnimBlendOpInt()394     AnimBlendOpInt()
395     : AnimBlendOp(false, false) {} // ブレンド処理なし(常に上書き)
396 
397     //! デストラクタです。
~AnimBlendOpInt()398     virtual ~AnimBlendOpInt() {}
399 
400     //@}
401 
402     //----------------------------------------
403     //! @name ブレンド
404     //@{
405 
Override(AnimResult * dst,const AnimResult * src)406     virtual bool Override(AnimResult* dst, const AnimResult* src) const
407     {
408         *reinterpret_cast<int*>(dst->GetValueBuffer()) =
409             *reinterpret_cast<const int*>(src->GetValueBuffer());
410         dst->SetFlags(VALID_SINGLE);
411         return true;
412     }
413 
414     //@}
415 
416     //----------------------------------------
417     //! @name 適用
418     //@{
419 
Apply(void * target,const AnimResult * result)420     virtual void Apply(void* target, const AnimResult* result) const
421     {
422         *reinterpret_cast<int*>(target) =
423             *reinterpret_cast<const int*>(result->GetValueBuffer());
424     }
425 
ConvertToAnimResult(AnimResult * result,const void * source)426     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
427     {
428         *reinterpret_cast<int*>(result->GetValueBuffer()) =
429             *reinterpret_cast<const int*>(source);
430         result->SetFlags(VALID_SINGLE);
431     }
432     //@}
433 };
434 
435 //---------------------------------------------------------------------------
436 //! @brief float アニメーションのブレンドオペレーションのクラスです。
437 //---------------------------------------------------------------------------
438 class AnimBlendOpFloat : public AnimBlendOp
439 {
440 public:
441     //----------------------------------------
442     //! @name コンストラクタ/デストラクタ
443     //@{
444 
445     //! コンストラクタです。
AnimBlendOpFloat()446     AnimBlendOpFloat()
447     : AnimBlendOp(true, false) {}
448 
449     //! デストラクタです。
~AnimBlendOpFloat()450     virtual ~AnimBlendOpFloat() {}
451 
452     //@}
453 
454     //----------------------------------------
455     //! @name ブレンド
456     //@{
457 
458     virtual bool Blend(
459         AnimResult* dst,
460         float* dstWeights,
461         const AnimResult* src,
462         const float* srcWeights) const;
463 
Override(AnimResult * dst,const AnimResult * src)464     virtual bool Override(AnimResult* dst, const AnimResult* src) const
465     {
466         *reinterpret_cast<float*>(dst->GetValueBuffer()) =
467             *reinterpret_cast<const float*>(src->GetValueBuffer());
468         dst->SetFlags(VALID_SINGLE);
469         return true;
470     }
471 
472     //@}
473 
474     //----------------------------------------
475     //! @name 適用
476     //@{
477 
Apply(void * target,const AnimResult * result)478     virtual void Apply(void* target, const AnimResult* result) const
479     {
480         *reinterpret_cast<float*>(target) =
481             *reinterpret_cast<const float*>(result->GetValueBuffer());
482     }
483 
ConvertToAnimResult(AnimResult * result,const void * source)484     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
485     {
486         *reinterpret_cast<float*>(result->GetValueBuffer()) =
487             *reinterpret_cast<const float*>(source);
488         result->SetFlags(VALID_SINGLE);
489     }
490     //@}
491 };
492 
493 //---------------------------------------------------------------------------
494 //! @brief Vector2 アニメーションのブレンドオペレーションのクラスです。
495 //---------------------------------------------------------------------------
496 class AnimBlendOpVector2 : public AnimBlendOp
497 {
498 public:
499     //! 成分数の定義です。
500     enum { COMP_COUNT = 2 };
501 
502     //! フラグの定義です。
503     enum { VALID_ALL = VALID_XY };
504 
505     //----------------------------------------
506     //! @name コンストラクタ/デストラクタ
507     //@{
508 
509     //! コンストラクタです。
AnimBlendOpVector2()510     AnimBlendOpVector2()
511     : AnimBlendOp(true, false) {}
512 
513     //! デストラクタです。
~AnimBlendOpVector2()514     virtual ~AnimBlendOpVector2() {}
515 
516     //@}
517 
518     //----------------------------------------
519     //! @name ブレンド
520     //@{
521 
Blend(AnimResult * dst,float * dstWeights,const AnimResult * src,const float * srcWeights)522     virtual bool Blend(
523         AnimResult* dst,
524         float* dstWeights,
525         const AnimResult* src,
526         const float* srcWeights) const
527     {
528         NW_ASSERT(src->GetFlags() & VALID_ALL);
529         (void)dstWeights;
530         return BlendFloatVector(dst, src, srcWeights[0], COMP_COUNT);
531     }
532 
Override(AnimResult * dst,const AnimResult * src)533     virtual bool Override(AnimResult* dst, const AnimResult* src) const
534     {
535         return OverrideFloatVector(dst, src, COMP_COUNT, VALID_ALL);
536     }
537 
538     //@}
539 
540     //----------------------------------------
541     //! @name 適用
542     //@{
543 
Apply(void * target,const AnimResult * result)544     virtual void Apply(void* target, const AnimResult* result) const
545     {
546         ApplyFloatVector(target, result, COMP_COUNT);
547     }
548 
ConvertToAnimResult(AnimResult * result,const void * source)549     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
550     {
551         ConvertFloatVectorToAnimResult(result, source, COMP_COUNT);
552     }
553     //@}
554 };
555 
556 //---------------------------------------------------------------------------
557 //! @brief Vector3 アニメーションのブレンドオペレーションのクラスです。
558 //---------------------------------------------------------------------------
559 class AnimBlendOpVector3 : public AnimBlendOp
560 {
561 public:
562     //! 成分数の定義です。
563     enum { COMP_COUNT = 3 };
564 
565     //! フラグの定義です。
566     enum { VALID_ALL = VALID_XYZ };
567 
568     //----------------------------------------
569     //! @name コンストラクタ/デストラクタ
570     //@{
571 
572     //! コンストラクタです。
AnimBlendOpVector3()573     AnimBlendOpVector3()
574     : AnimBlendOp(true, false) {}
575 
576     //! デストラクタです。
~AnimBlendOpVector3()577     virtual ~AnimBlendOpVector3() {}
578 
579     //@}
580 
581     //----------------------------------------
582     //! @name ブレンド
583     //@{
584 
Blend(AnimResult * dst,float * dstWeights,const AnimResult * src,const float * srcWeights)585     virtual bool Blend(
586         AnimResult* dst,
587         float* dstWeights,
588         const AnimResult* src,
589         const float* srcWeights) const
590     {
591         NW_ASSERT(src->GetFlags() & VALID_ALL);
592         (void)dstWeights;
593         return BlendFloatVector(dst, src, srcWeights[0], COMP_COUNT);
594     }
595 
Override(AnimResult * dst,const AnimResult * src)596     virtual bool Override(AnimResult* dst, const AnimResult* src) const
597     {
598         return OverrideFloatVector(dst, src, COMP_COUNT, VALID_ALL);
599     }
600 
601     //@}
602 
603     //----------------------------------------
604     //! @name 適用
605     //@{
606 
Apply(void * target,const AnimResult * result)607     virtual void Apply(void* target, const AnimResult* result) const
608     {
609         ApplyFloatVector(target, result, COMP_COUNT);
610     }
611 
ConvertToAnimResult(AnimResult * result,const void * source)612     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
613     {
614         ConvertFloatVectorToAnimResult(result, source, COMP_COUNT);
615     }
616     //@}
617 };
618 
619 //---------------------------------------------------------------------------
620 //! @brief RGBA カラーアニメーションのブレンドオペレーションのクラスです。
621 //---------------------------------------------------------------------------
622 class AnimBlendOpRgbaColor : public AnimBlendOp
623 {
624 public:
625     //! 成分数です。
626     enum { COMPONENT_COUNT = 4 };
627 
628     //----------------------------------------
629     //! @name コンストラクタ/デストラクタ
630     //@{
631 
632     //! コンストラクタです。
AnimBlendOpRgbaColor()633     AnimBlendOpRgbaColor()
634     : AnimBlendOp(true, false) {}
635 
636     //! デストラクタです。
~AnimBlendOpRgbaColor()637     virtual ~AnimBlendOpRgbaColor() {}
638 
639     //@}
640 
641     //----------------------------------------
642     //! @name ブレンド
643     //@{
644 
645     virtual bool Blend(
646         AnimResult* dst,
647         float* dstWeights,
648         const AnimResult* src,
649         const float* srcWeights) const;
650 
651     virtual bool Override(AnimResult* dst, const AnimResult* src) const;
652 
653     //@}
654 
655     //----------------------------------------
656     //! @name 適用
657     //@{
658 
659     virtual void Apply(void* target, const AnimResult* result) const;
660 
661     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const;
662     //@}
663 };
664 
665 //---------------------------------------------------------------------------
666 //! @brief テクスチャパターンアニメーションのブレンドオペレーションのクラスです。
667 //---------------------------------------------------------------------------
668 class AnimBlendOpTexture : public AnimBlendOp
669 {
670 public:
671     //----------------------------------------
672     //! @name コンストラクタ/デストラクタ
673     //@{
674 
675     //! コンストラクタです。
AnimBlendOpTexture()676     AnimBlendOpTexture()
677     : AnimBlendOp(false, false) {} // ブレンド処理なし(常に上書き)
678 
679     //! デストラクタです。
~AnimBlendOpTexture()680     virtual ~AnimBlendOpTexture() {}
681 
682     //@}
683 
684     //----------------------------------------
685     //! @name ブレンド
686     //@{
687 
Override(AnimResult * dst,const AnimResult * src)688     virtual bool Override(AnimResult* dst, const AnimResult* src) const
689     {
690         ut::Offset* dstOffset = reinterpret_cast<ut::Offset*>(dst->GetValueBuffer());
691         const ut::Offset* srcOffset = reinterpret_cast<const ut::Offset*>(src->GetValueBuffer());
692 
693         dstOffset->set_ptr(srcOffset->to_ptr());
694         dst->SetFlags(VALID_SINGLE);
695         return true;
696     }
697 
698     //@}
699 
700     //----------------------------------------
701     //! @name 適用
702     //@{
703 
Apply(void * target,const AnimResult * result)704     virtual void Apply(void* target, const AnimResult* result) const
705     {
706         ut::Offset* dstOffset = reinterpret_cast<ut::Offset*>(target);
707         const ut::Offset* srcOffset = reinterpret_cast<const ut::Offset*>(result->GetValueBuffer());
708 
709         dstOffset->set_ptr(srcOffset->to_ptr());
710     }
711 
ConvertToAnimResult(AnimResult * result,const void * source)712     virtual void ConvertToAnimResult(AnimResult* result, const void* source) const
713     {
714         ut::Offset* dstOffset = reinterpret_cast<ut::Offset*>(result->GetValueBuffer());
715         const ut::Offset* srcOffset = reinterpret_cast<const ut::Offset*>(source);
716 
717         dstOffset->set_ptr(srcOffset->to_ptr());
718         result->SetFlags(VALID_SINGLE);
719     }
720     //@}
721 };
722 
723 } /* namespace anim */
724 } /* namespace nw */
725 
726 #endif /* NW_ANIM_ANIMBLEND_H_ */
727