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