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