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