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