/*---------------------------------------------------------------------------* Project: NintendoWare File: anim_ResAnim.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: $ *---------------------------------------------------------------------------*/ #ifndef NW_ANIM_RESANIMATION_H_ #define NW_ANIM_RESANIMATION_H_ #include #include #include #include #include #include #include #include #include #include #include namespace nw { namespace gfx { class CalculatedTransform; namespace res { class ResGraphicsFile; } // namespace res } // namespace gfx namespace anim { namespace res {} using namespace ::nw::anim::res; namespace res { //--------------------------------------------------------------------------- //! @brief アニメーションセットのデータ構造です。 //--------------------------------------------------------------------------- //! @details :private struct ResAnimData { enum LoopMode { LOOP_MODE_ONETIME, LOOP_MODE_LOOP }; // メンバに変更があった場合、anim/anim_ResUtilのClone関数にも変更を適用してください。 ut::BinaryRevisionHeader m_Header; ut::BinString toName; ut::BinString toTargetAnimGroupName; ut::ResU8 m_LoopMode; u8 padding_[3]; ut::ResF32 m_FrameSize; ut::ResS32 m_MemberAnimSetDicCount; ut::Offset toMemberAnimSetDic; ut::ResS32 m_UserDataDicCount; ut::Offset toUserDataDic; }; //! @details :private struct ResLightAnimData : public ResAnimData { enum LightType { LIGHT_TYPE_FRAGMENT, LIGHT_TYPE_VERTEX, LIGHT_TYPE_HEMISPHERE, LIGHT_TYPE_AMBIENT }; // ResFragmentLight::Kindの値 ut::ResU32 m_LightKind; // LightTypeの値 ut::ResU32 m_LightType; }; //! @details :private struct ResCameraAnimData : public ResAnimData { enum ProjectionUpdaterKind { PROJECTION_UPDATER_PERSPECTIVE, PROJECTION_UPDATER_ORTHO, // FRUSTUMはツール側では定義されていません。なので末尾に種類だけ定義されます。 PROJECTION_UPDATER_FRUSTUM }; enum ViewUpdaterKind { VIEW_UPDATER_AIM, VIEW_UPDATER_LOOKAT, VIEW_UPDATER_ROTATE }; // アニメーションが期待するProjectionUpdaterの値 ut::ResU32 m_ProjectionUpdaterKind; // アニメーションが期待するViewUpdaterの値 ut::ResU32 m_ViewUpdaterKind; }; //--------------------------------------------------------------------------- //! @brief メンバアニメーションの情報です。 //--------------------------------------------------------------------------- //! @details :private struct ResMemberAnimData { ut::ResU32 m_Flags; ut::BinString toPath; ut::ResU32 m_PrimitiveType; }; //! @details :private struct ResFloatAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT = 0x1 << 0 }; union { ut::ResF32 constantValue; ut::Offset toCurve; }; }; //! @details :private struct ResIntAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT = 0x1 << 0 }; union { ut::ResS32 constantValue; ut::Offset toCurve; }; }; //! @details :private struct ResBoolAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT = 0x1 << 0, FLAG_CONSTANT_VALUE = 0x1 << 1 }; ut::Offset toCurve; }; //! @details :private struct ResVec2AnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT_X_SHIFT = 0, FLAG_CONSTANT_Y_SHIFT, FLAG_X_NOT_EXIST_SHIFT, FLAG_Y_NOT_EXIST_SHIFT, FLAG_CONSTANT_X = 0x1 << FLAG_CONSTANT_X_SHIFT, FLAG_CONSTANT_Y = 0x1 << FLAG_CONSTANT_Y_SHIFT, FLAG_X_NOT_EXIST = 0x1 << FLAG_X_NOT_EXIST_SHIFT, FLAG_Y_NOT_EXIST = 0x1 << FLAG_Y_NOT_EXIST_SHIFT }; union { ut::ResF32 constantValueCurveX; ut::Offset toCurveX; }; union { ut::ResF32 constantValueCurveY; ut::Offset toCurveY; }; }; //! @details :private struct ResVec3AnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT_X_SHIFT = 0, FLAG_CONSTANT_Y_SHIFT, FLAG_CONSTANT_Z_SHIFT, FLAG_X_NOT_EXIST_SHIFT, FLAG_Y_NOT_EXIST_SHIFT, FLAG_Z_NOT_EXIST_SHIFT, FLAG_CONSTANT_X = 0x1 << FLAG_CONSTANT_X_SHIFT, FLAG_CONSTANT_Y = 0x1 << FLAG_CONSTANT_Y_SHIFT, FLAG_CONSTANT_Z = 0x1 << FLAG_CONSTANT_Z_SHIFT, FLAG_X_NOT_EXIST = 0x1 << FLAG_X_NOT_EXIST_SHIFT, FLAG_Y_NOT_EXIST = 0x1 << FLAG_Y_NOT_EXIST_SHIFT, FLAG_Z_NOT_EXIST = 0x1 << FLAG_Z_NOT_EXIST_SHIFT }; union { ut::ResF32 constantValueCurveX; ut::Offset toCurveX; }; union { ut::ResF32 constantValueCurveY; ut::Offset toCurveY; }; union { ut::ResF32 constantValueCurveZ; ut::Offset toCurveZ; }; }; //! @details :private struct ResRgbaColorAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT_R_SHIFT = 0, FLAG_CONSTANT_G_SHIFT, FLAG_CONSTANT_B_SHIFT, FLAG_CONSTANT_A_SHIFT, FLAG_R_NOT_EXIST_SHIFT, FLAG_G_NOT_EXIST_SHIFT, FLAG_B_NOT_EXIST_SHIFT, FLAG_A_NOT_EXIST_SHIFT, FLAG_CONSTANT_R = 0x1 << FLAG_CONSTANT_R_SHIFT, FLAG_CONSTANT_G = 0x1 << FLAG_CONSTANT_G_SHIFT, FLAG_CONSTANT_B = 0x1 << FLAG_CONSTANT_B_SHIFT, FLAG_CONSTANT_A = 0x1 << FLAG_CONSTANT_A_SHIFT, FLAG_R_NOT_EXIST = 0x1 << FLAG_R_NOT_EXIST_SHIFT, FLAG_G_NOT_EXIST = 0x1 << FLAG_G_NOT_EXIST_SHIFT, FLAG_B_NOT_EXIST = 0x1 << FLAG_B_NOT_EXIST_SHIFT, FLAG_A_NOT_EXIST = 0x1 << FLAG_A_NOT_EXIST_SHIFT }; union { ut::ResF32 constantValueCurveR; ut::Offset toCurveR; }; union { ut::ResF32 constantValueCurveG; ut::Offset toCurveG; }; union { ut::ResF32 constantValueCurveB; ut::Offset toCurveB; }; union { ut::ResF32 constantValueCurveA; ut::Offset toCurveA; }; }; //! @details :private struct ResTextureAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT = 0x1 << 0 }; union { ut::ResF32 constantValueCurve; ut::Offset toCurve; }; ut::ResS32 m_TexturesTableCount; ut::Offset toTexturesTable; }; //! @details :private struct ResTransformAnimData : public ResMemberAnimData { // TODO: 項目はボーンのフラグに合わせて修正。 enum Flag { FLAG_IDENTITY_SHIFT = 0, FLAG_RT_ZERO_SHIFT, FLAG_SCALE_ONE_SHIFT, FLAG_SCALE_UNIFORM_SHIFT, FLAG_ROTATE_ZERO_SHIFT, FLAG_TRANSLATE_ZERO_SHIFT, FLAG_CONSTANT_SCALE_X_SHIFT, FLAG_CONSTANT_SCALE_Y_SHIFT, FLAG_CONSTANT_SCALE_Z_SHIFT, FLAG_CONSTANT_ROTATE_X_SHIFT, FLAG_CONSTANT_ROTATE_Y_SHIFT, FLAG_CONSTANT_ROTATE_Z_SHIFT, FLAG_CONSTANT_ROTATE_W_SHIFT, FLAG_CONSTANT_TRANSLATE_X_SHIFT, FLAG_CONSTANT_TRANSLATE_Y_SHIFT, FLAG_CONSTANT_TRANSLATE_Z_SHIFT, FLAG_SCALE_X_NOT_EXIST_SHIFT, FLAG_SCALE_Y_NOT_EXIST_SHIFT, FLAG_SCALE_Z_NOT_EXIST_SHIFT, FLAG_ROTATE_X_NOT_EXIST_SHIFT, FLAG_ROTATE_Y_NOT_EXIST_SHIFT, FLAG_ROTATE_Z_NOT_EXIST_SHIFT, FLAG_ROTATE_W_NOT_EXIST_SHIFT, FLAG_TRANSLATE_X_NOT_EXIST_SHIFT, FLAG_TRANSLATE_Y_NOT_EXIST_SHIFT, FLAG_TRANSLATE_Z_NOT_EXIST_SHIFT, FLAG_IDENTITY = 0x1 << FLAG_IDENTITY_SHIFT, FLAG_RT_ZERO = 0x1 << FLAG_RT_ZERO_SHIFT, FLAG_SCALE_ONE = 0x1 << FLAG_SCALE_ONE_SHIFT, FLAG_SCALE_UNIFORM = 0x1 << FLAG_SCALE_UNIFORM_SHIFT, FLAG_ROTATE_ZERO = 0x1 << FLAG_ROTATE_ZERO_SHIFT, FLAG_TRANSLATE_ZERO = 0x1 << FLAG_TRANSLATE_ZERO_SHIFT, FLAG_CONSTANT_SCALE_X = 0x1 << FLAG_CONSTANT_SCALE_X_SHIFT, FLAG_CONSTANT_SCALE_Y = 0x1 << FLAG_CONSTANT_SCALE_Y_SHIFT, FLAG_CONSTANT_SCALE_Z = 0x1 << FLAG_CONSTANT_SCALE_Z_SHIFT, FLAG_CONSTANT_ROTATE_X = 0x1 << FLAG_CONSTANT_ROTATE_X_SHIFT, FLAG_CONSTANT_ROTATE_Y = 0x1 << FLAG_CONSTANT_ROTATE_Y_SHIFT, FLAG_CONSTANT_ROTATE_Z = 0x1 << FLAG_CONSTANT_ROTATE_Z_SHIFT, FLAG_CONSTANT_ROTATE_W = 0x1 << FLAG_CONSTANT_ROTATE_W_SHIFT, FLAG_CONSTANT_TRANSLATE_X = 0x1 << FLAG_CONSTANT_TRANSLATE_X_SHIFT, FLAG_CONSTANT_TRANSLATE_Y = 0x1 << FLAG_CONSTANT_TRANSLATE_Y_SHIFT, FLAG_CONSTANT_TRANSLATE_Z = 0x1 << FLAG_CONSTANT_TRANSLATE_Z_SHIFT, FLAG_SCALE_X_NOT_EXIST = 0x1 << FLAG_SCALE_X_NOT_EXIST_SHIFT, FLAG_SCALE_Y_NOT_EXIST = 0x1 << FLAG_SCALE_Y_NOT_EXIST_SHIFT, FLAG_SCALE_Z_NOT_EXIST = 0x1 << FLAG_SCALE_Z_NOT_EXIST_SHIFT, FLAG_ROTATE_X_NOT_EXIST = 0x1 << FLAG_ROTATE_X_NOT_EXIST_SHIFT, FLAG_ROTATE_Y_NOT_EXIST = 0x1 << FLAG_ROTATE_Y_NOT_EXIST_SHIFT, FLAG_ROTATE_Z_NOT_EXIST = 0x1 << FLAG_ROTATE_Z_NOT_EXIST_SHIFT, FLAG_ROTATE_W_NOT_EXIST = 0x1 << FLAG_ROTATE_W_NOT_EXIST_SHIFT, FLAG_TRANSLATE_X_NOT_EXIST = 0x1 << FLAG_TRANSLATE_X_NOT_EXIST_SHIFT, FLAG_TRANSLATE_Y_NOT_EXIST = 0x1 << FLAG_TRANSLATE_Y_NOT_EXIST_SHIFT, FLAG_TRANSLATE_Z_NOT_EXIST = 0x1 << FLAG_TRANSLATE_Z_NOT_EXIST_SHIFT, FLAG_SCALE_NOT_EXIST = (FLAG_SCALE_X_NOT_EXIST | FLAG_SCALE_Y_NOT_EXIST | FLAG_SCALE_Z_NOT_EXIST), FLAG_ROTATE_NOT_EXIST = (FLAG_ROTATE_X_NOT_EXIST | FLAG_ROTATE_Y_NOT_EXIST | FLAG_ROTATE_Z_NOT_EXIST), FLAG_TRANSLATE_NOT_EXIST = (FLAG_TRANSLATE_X_NOT_EXIST | FLAG_TRANSLATE_Y_NOT_EXIST | FLAG_TRANSLATE_Z_NOT_EXIST) }; union { ut::ResF32 constantValueScaleX; ut::Offset toScaleX; }; union { ut::ResF32 constantValueScaleY; ut::Offset toScaleY; }; union { ut::ResF32 constantValueScaleZ; ut::Offset toScaleZ; }; union { ut::ResF32 constantValueRotateX; ut::Offset toRotateX; }; union { ut::ResF32 constantValueRotateY; ut::Offset toRotateY; }; union { ut::ResF32 constantValueRotateZ; ut::Offset toRotateZ; }; union { ut::ResF32 constantValueRotateW; ut::Offset toRotateW; }; union { ut::ResF32 constantValueTranslateX; ut::Offset toTranslateX; }; union { ut::ResF32 constantValueTranslateY; ut::Offset toTranslateY; }; union { ut::ResF32 constantValueTranslateZ; ut::Offset toTranslateZ; }; }; //! @details :private struct ResBakedTransformAnimData : public ResMemberAnimData { enum Flag { FLAG_CONSTANT_TRANSLATE_SHIFT = 0, FLAG_CONSTANT_ROTATE_SHIFT, FLAG_CONSTANT_SCALE_SHIFT, FLAG_TRANSLATE_NOT_EXIST_SHIFT, FLAG_ROTATE_NOT_EXIST_SHIFT, FLAG_SCALE_NOT_EXIST_SHIFT, FLAG_CONSTANT_TRANSLATE = 0x1 << FLAG_CONSTANT_TRANSLATE_SHIFT, FLAG_CONSTANT_ROTATE = 0x1 << FLAG_CONSTANT_ROTATE_SHIFT, FLAG_CONSTANT_SCALE = 0x1 << FLAG_CONSTANT_SCALE_SHIFT, FLAG_TRANSLATE_NOT_EXIST = 0x1 << FLAG_TRANSLATE_NOT_EXIST_SHIFT, FLAG_ROTATE_NOT_EXIST = 0x1 << FLAG_ROTATE_NOT_EXIST_SHIFT, FLAG_SCALE_NOT_EXIST = 0x1 << FLAG_SCALE_NOT_EXIST_SHIFT }; // RotateはVector4(Quaternion)で、 // Scale、TranslateはVector3で格納されています。 ut::Offset toRotate; ut::Offset toTranslate; ut::Offset toScale; }; //! @details :private struct ResFullBakedAnimData : public ResMemberAnimData { ut::Offset toTransform; }; //! @brief 一つの要素のアニメーションデータを持つリソースクラスです。 //! //! 要素に対応する継承先のクラスで、要素の型に即した評価関数などが定義されます。 //! 継承先のクラスは、Int,Floatのように、カーブの型ごとに定義されています。 //! class ResMemberAnim : public ut::ResCommon< ResMemberAnimData > { public: //! アニメーションする要素の型です。 enum PrimitiveType { PRIMITIVETYPE_FLOAT, PRIMITIVETYPE_INT, PRIMITIVETYPE_BOOL, PRIMITIVETYPE_VECTOR2, PRIMITIVETYPE_VECTOR3, PRIMITIVETYPE_TRANSFORM, PRIMITIVETYPE_RGBA_COLOR, PRIMITIVETYPE_TEXTURE, PRIMITIVETYPE_BAKED_TRANSFORM, PRIMITIVETYPE_FULL_BAKED }; NW_RES_CTOR( ResMemberAnim ) //! @name リソースへのアクセス //! @{ //--------------------------------------------------------------------------- //! @fn u32 GetFlags() const //! @brief フラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFlags(u32 flags) //! @brief フラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void EnableFlags(u32 flags) //! @brief フラグを有効にします。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void DisableFlags(u32 flags) //! @brief フラグを無効にします。 //--------------------------------------------------------------------------- NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags() //--------------------------------------------------------------------------- //! @fn const char* GetPath() const //! @brief Path を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( Path ) // GetPath() //--------------------------------------------------------------------------- //! @fn u32 GetPrimitiveType() const //! @brief アニメーションする要素を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetPrimitiveType(u32 primitiveType) //! @brief アニメーションする要素を設定します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( u32, PrimitiveType ) // GetPrimitiveType(), SetPrimitiveType() //! @} //! リソースの初期化処理をおこないます。 gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile); //! リソースの後始末をおこないます。 void Cleanup(); //! プリミティブのサイズをバイト数で取得します。 int GetPrimitiveSize() const; //! タイプに応じてアニメーション結果を評価します。 bit32 EvaluateResultForType( void* dstBuf, bit32 dstFlags, float frame, const void* originalValue) const; //! @brief タイプに応じてアニメーション結果のキャッシュを対象に適用します。 //! @details ブレンドオペレーションを使用しない場合に呼ばれます。 void ApplyCacheForType( void* target, const void* cacheBuf) const; }; typedef ut::ResArrayClass::type ResMemberAnimArray; //!< @details :private //! @brief アニメーションのリソースクラスです。 //! //! ResMemberAnimを束ねて、アニメーションとしてまとめます。 //! ループ再生の設定、フレーム数などの情報を持ちます。 //! class ResAnim : public ut::ResCommon< ResAnimData > { public: enum { BINARY_REVISION = REVISION_RES_ANIM_DATA }; enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnim) }; enum { SIGNATURE = NW_RES_SIGNATURE32('ADAT') }; NW_RES_CTOR( ResAnim ) //! @name リソースへのアクセス //! @{ //--------------------------------------------------------------------------- //! @fn nw::ut::BinaryRevisionHeader GetHeader() //! @brief バイナリ情報のヘッダを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetHeader(const nw::ut::BinaryRevisionHeader& header) //! @brief バイナリ情報のヘッダを設定します。 //! @details :private //--------------------------------------------------------------------------- NW_RES_FIELD_STRUCT_DECL( nw::ut::BinaryRevisionHeader, Header ) // GetHeader() //--------------------------------------------------------------------------- //! @brief リビジョンを取得します。 //! //! @return リソースのリビジョン情報です。 //--------------------------------------------------------------------------- u32 GetRevision() const { return this->GetHeader().revision; } //--------------------------------------------------------------------------- //! @fn const char* GetName() const //! @brief 名前を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( Name ) // GetName() //--------------------------------------------------------------------------- //! @fn const char* GetTargetAnimGroupName() const //! @brief アニメーションさせる AnimGroup の名前を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( TargetAnimGroupName ) // GetTargetAnimGroupName() //--------------------------------------------------------------------------- //! @fn u8 GetLoopMode() const //! @brief ループモードを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetLoopMode(u8 loopMode) //! @brief ループモードを設定します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( u8, LoopMode ) // GetLoopMode(), SetLoopMode() //--------------------------------------------------------------------------- //! @fn f32 GetFrameSize() const //! @brief アニメーションフレームの長さを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFrameSize(f32 frameSize) //! @brief アニメーションフレームの長さを設定します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( f32, FrameSize ) // GetFrameSize(), SetFrameSize() //--------------------------------------------------------------------------- //! @fn s32 GetMemberAnimSetIndex(const char * key) const //! @brief メンバーアニメーションの辞書データ中でのインデックス番号を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetMemberAnimSetCount() const //! @brief メンバーアニメーションの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResMemberAnim GetMemberAnimSet(int idx) //! @brief メンバーアニメーションを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DIC_DECL( ResMemberAnim, MemberAnimSet, ut::ResDicPatricia ) // GetMemberAnimSet(int), GetMemberAnimSet(const char*), GetMemberAnimSetIndex(const char*), GetMemberAnimSetCount() //--------------------------------------------------------------------------- //! @fn s32 GetUserDataIndex(const char * key) const //! @brief ユーザデータの辞書データ中でのインデックス番号を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetUserDataCount() const //! @brief ユーザデータの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn nw::ut::ResMetaData GetUserData(int idx) //! @brief ユーザデータを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DIC_DECL( nw::ut::ResMetaData, UserData, ut::ResDicPatricia ) // GetUserData(int), GetUserData(const char*), GetUserDataIndex(const char*) GetUserDataCount() //! @} //! リソースの初期化処理をおこないます。 gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile); //! リソースの後始末をおこないます。 void Cleanup(); //! @name リソースの生成 //! @{ //! @brief 空のスケルタルアニメーションリソースを作成します。 //! //! @param[in] allocator 生成に使用するアロケーターです。 //! //! @return 空のスケルタルアニメーションリソースを返します。 static ResAnim CreateEmptySkeletalAnim(nw::os::IAllocator* allocator) { return CreateEmptyResAnim(allocator, "SkeletalAnimation"); } //! @brief 空のマテリアルアニメーションリソースを作成します。 //! //! @param[in] allocator 生成に使用するアロケーターです。 //! //! @return 空のマテリアルアニメーションリソースを返します。 static ResAnim CreateEmptyMaterialAnim(nw::os::IAllocator* allocator) { return CreateEmptyResAnim(allocator, "MaterialAnimation"); } //! @brief 空のビジビリティアニメーションリソースを作成します。 //! //! @param[in] allocator 生成に使用するアロケーターです。 //! //! @return 空のビジビリティアニメーションリソースを返します。 static ResAnim CreateEmptyVisibilityAnim(nw::os::IAllocator* allocator) { return CreateEmptyResAnim(allocator, "VisibilityAnimation"); } //! @brief 空のカメラアニメーションリソースを作成します。 //! //! @param[in] allocator 生成に使用するアロケーターです。 //! //! @return 空のカメラアニメーションリソースを返します。 static ResAnim CreateEmptyCameraAnim(nw::os::IAllocator* allocator) { return CreateEmptyResAnim(allocator, "CameraAnimation"); } //! @brief 空のライトアニメーションリソースを作成します。 //! //! @param[in] allocator 生成に使用するアロケーターです。 //! //! @return 空のライトアニメーションリソースを返します。 static ResAnim CreateEmptyLightAnim(nw::os::IAllocator* allocator) { return CreateEmptyResAnim(allocator, "LightAnimation"); } //! フルベイクアニメーションデータかどうかを取得します。 bool IsFullBakedAnim() const; //! @} private: static ResAnim CreateEmptyResAnim(nw::os::IAllocator* allocator, const char* targetAnimGroupName); }; //! @details :private class ResLightAnim : public ResAnim { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightAnim) }; enum { SIGNATURE = NW_RES_SIGNATURE32('ADLT') }; NW_RES_CTOR_INHERIT( ResLightAnim, ResAnim ) NW_RES_FIELD_PRIMITIVE_DECL( u32, LightKind ) // GetLightKind(), SetLightKind() NW_RES_FIELD_PRIMITIVE_DECL( u32, LightType ) // GetLightType(), SetLightType() }; //! @details :private class ResCameraAnim : public ResAnim { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResCameraAnim) }; enum { SIGNATURE = NW_RES_SIGNATURE32('ADCM') }; NW_RES_CTOR_INHERIT( ResCameraAnim, ResAnim ) NW_RES_FIELD_PRIMITIVE_DECL( u32, ProjectionUpdaterKind ) // GetProjectionUpdaterKind(), SetProjectionUpdaterKind() NW_RES_FIELD_PRIMITIVE_DECL( u32, ViewUpdaterKind ) // GetViewUpdaterKind(), SetViewUpdaterKind() }; #define NW_RESANM_GETCURVE_DECL( type, name, hasNoCurveFlag ) \ const type* Get##name() const \ { \ if ( ref().m_Flags & (hasNoCurveFlag) ) \ { \ return NULL; \ } \ else \ { \ return reinterpret_cast( ref().to##name.to_ptr() ); \ } \ } \ \ type* Get##name() \ { \ if ( ref().m_Flags & (hasNoCurveFlag) ) \ { \ return NULL; \ } \ else \ { \ return reinterpret_cast( ref().to##name.to_ptr() ); \ } \ } \ #define NW_RESANM_EVALUATE_FLOAT_DECL(name, constantFlag) \ f32 Evaluate##name( f32 frame ) const \ { \ if ( ref().m_Flags & (constantFlag) ) \ { \ return ref().constantValue##name; \ } \ else \ { \ return CalcFloatCurve( \ reinterpret_cast( ref().to##name.to_ptr() ), \ frame ); \ } \ } \ #define NW_RESANM_EVALUATE_INT_DECL(name, constantFlag) \ s32 Evaluate##name( f32 frame ) const \ { \ if ( ref().m_Flags & (constantFlag) ) \ { \ return ref().constantValue##name; \ } \ else \ { \ return CalcIntCurve( \ reinterpret_cast( ref().to##name.to_ptr() ), \ frame ); \ } \ } \ #define NW_RESANM_EVALUATE_VEC3_DECL(name, constantFlag) \ void Evaluate##name( math::VEC3* result, bit32* flags, f32 frame ) const \ { \ if ( ref().m_Flags & (constantFlag) ) \ { \ CalcVector3Curve( \ result, \ flags, \ reinterpret_cast( ref().to##name.to_ptr() ), \ 0 ); \ } \ else \ { \ CalcVector3Curve( \ result, \ flags, \ reinterpret_cast( ref().to##name.to_ptr() ), \ frame ); \ } \ } \ //! @details :private class ResFloatAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResFloatAnim, ResMemberAnim ) /* ctor */ ResFloatAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_FLOAT ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResFloatAnimData::FLAG_CONSTANT ) f32 Evaluate( f32 frame ) const { if ( ref().m_Flags & ResFloatAnimData::FLAG_CONSTANT ) { return ref().constantValue; } else { return CalcFloatCurve( reinterpret_cast( ref().toCurve.to_ptr() ), frame ); } } bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const { *reinterpret_cast(dstBuf) = Evaluate(frame); dstFlags |= AnimResult::FLAG_VALID_COMPONENT0; return dstFlags; } void ApplyCache( void* target, const void* cacheBuf) const { *reinterpret_cast(target) = *reinterpret_cast(cacheBuf); } }; //! @details :private class ResIntAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResIntAnim, ResMemberAnim ) /* ctor */ ResIntAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_INT ); } NW_RESANM_GETCURVE_DECL( ResIntCurveData, Curve, ResIntAnimData::FLAG_CONSTANT ) s32 Evaluate( f32 frame ) const { if ( ref().m_Flags & ResIntAnimData::FLAG_CONSTANT ) { return ref().constantValue; } else { return CalcIntCurve( reinterpret_cast( ref().toCurve.to_ptr() ), frame ); } } bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const { *reinterpret_cast(dstBuf) = Evaluate(frame); dstFlags |= AnimResult::FLAG_VALID_COMPONENT0; return dstFlags; } void ApplyCache( void* target, const void* cacheBuf) const { *reinterpret_cast(target) = *reinterpret_cast(cacheBuf); } }; //! @details :private class ResBoolAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResBoolAnim, ResMemberAnim ) /* ctor */ ResBoolAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BOOL ); } NW_RESANM_GETCURVE_DECL( ResBoolCurveData, Curve, ResBoolAnimData::FLAG_CONSTANT ) bool Evaluate( f32 frame ) const { if ( ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT ) { return (ref().m_Flags & ResBoolAnimData::FLAG_CONSTANT_VALUE)? true : false; } else { return CalcBoolCurve( reinterpret_cast( ref().toCurve.to_ptr() ), frame ); } } bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const { *reinterpret_cast(dstBuf) = Evaluate(frame); dstFlags |= AnimResult::FLAG_VALID_COMPONENT0; return dstFlags; } void ApplyCache( void* target, const void* cacheBuf) const { *reinterpret_cast(target) = *reinterpret_cast(cacheBuf); } }; //! @details :private class ResVec2Anim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResVec2Anim, ResMemberAnim ) /* ctor */ ResVec2Anim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR2 ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec2AnimData::FLAG_CONSTANT_X ) // GetCurveX() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec2AnimData::FLAG_CONSTANT_Y ) // GetCurveY() NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec2AnimData::FLAG_CONSTANT_X ) // EvaluateCurveX(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec2AnimData::FLAG_CONSTANT_Y ) // EvaluateCurveY(f32 frame) bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const; void ApplyCache( void* target, const void* cacheBuf) const; }; //! @details :private class ResVec3Anim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResVec3Anim, ResMemberAnim ) /* ctor */ ResVec3Anim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_VECTOR3 ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveX, ResVec3AnimData::FLAG_CONSTANT_X ) // GetCurveX() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveY, ResVec3AnimData::FLAG_CONSTANT_Y ) // GetCurveY() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z ) // GetCurveZ() NW_RESANM_EVALUATE_FLOAT_DECL( CurveX, ResVec3AnimData::FLAG_CONSTANT_X ) // EvaluateCurveX(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveY, ResVec3AnimData::FLAG_CONSTANT_Y ) // EvaluateCurveY(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveZ, ResVec3AnimData::FLAG_CONSTANT_Z ) // EvaluateCurveZ(f32 frame) bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const; void ApplyCache( void* target, const void* cacheBuf) const; }; //! @details :private class ResRgbaColorAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResRgbaColorAnim, ResMemberAnim ) /* ctor */ ResRgbaColorAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_RGBA_COLOR ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R ) // GetCurveR() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G ) // GetCurveG() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B ) // GetCurveB() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A ) // GetCurveA() NW_RESANM_EVALUATE_FLOAT_DECL( CurveR, ResRgbaColorAnimData::FLAG_CONSTANT_R ) // EvaluateCurveR(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveG, ResRgbaColorAnimData::FLAG_CONSTANT_G ) // EvaluateCurveG(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveB, ResRgbaColorAnimData::FLAG_CONSTANT_B ) // EvaluateCurveB(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( CurveA, ResRgbaColorAnimData::FLAG_CONSTANT_A ) // EvaluateCurveA(f32 frame) bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const; void ApplyCache( void* target, const void* cacheBuf) const; }; //! @details :private class ResTextureAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResTextureAnim, ResMemberAnim ) /* ctor */ ResTextureAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TEXTURE ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, Curve, ResTextureAnimData::FLAG_CONSTANT ) // GetCurve() NW_RESANM_EVALUATE_FLOAT_DECL( Curve, ResTextureAnimData::FLAG_CONSTANT ) // EvaluateCurve(f32 frame) NW_RES_FIELD_CLASS_LIST_DECL( gfx::ResReferenceTexture, Textures ) // GetTexturesCount(), GetTextures(int idx), GetTextures() //! リソースの初期化処理をおこないます。 gfx::Result Setup(os::IAllocator* allocator, gfx::ResGraphicsFile graphicsFile); //! リソースの後始末をおこないます。 void Cleanup(); bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame) const; void ApplyCache( void* target, const void* cacheBuf) const; }; //! @details :private class ResTransformAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResTransformAnim, ResMemberAnim ) /* ctor */ ResTransformAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_TRANSFORM ); } NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X | ResTransformAnimData::FLAG_SCALE_X_NOT_EXIST ) // GetScaleX() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y | ResTransformAnimData::FLAG_SCALE_Y_NOT_EXIST ) // GetScaleY() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z | ResTransformAnimData::FLAG_SCALE_Z_NOT_EXIST ) // GetScaleZ() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X | ResTransformAnimData::FLAG_ROTATE_X_NOT_EXIST ) // GetRotateX() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y | ResTransformAnimData::FLAG_ROTATE_Y_NOT_EXIST ) // GetRotateY() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z | ResTransformAnimData::FLAG_ROTATE_Z_NOT_EXIST ) // GetRotateZ() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X | ResTransformAnimData::FLAG_TRANSLATE_X_NOT_EXIST ) // GetTranslateX() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y | ResTransformAnimData::FLAG_TRANSLATE_Y_NOT_EXIST ) // GetTranslateY() NW_RESANM_GETCURVE_DECL( ResFloatCurveData, TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z | ResTransformAnimData::FLAG_TRANSLATE_Z_NOT_EXIST ) // GetTranslateZ() NW_RESANM_EVALUATE_FLOAT_DECL( ScaleX, ResTransformAnimData::FLAG_CONSTANT_SCALE_X ) // EvaluateScaleX(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( ScaleY, ResTransformAnimData::FLAG_CONSTANT_SCALE_Y ) // EvaluateScaleY(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( ScaleZ, ResTransformAnimData::FLAG_CONSTANT_SCALE_Z ) // EvaluateScaleZ(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( RotateX, ResTransformAnimData::FLAG_CONSTANT_ROTATE_X ) // EvaluateRotateX(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( RotateY, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Y ) // EvaluateRotateY(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( RotateZ, ResTransformAnimData::FLAG_CONSTANT_ROTATE_Z ) // EvaluateRotateZ(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( TranslateX, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_X ) // EvaluateTranslateX(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( TranslateY, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Y ) // EvaluateTranslateY(f32 frame) NW_RESANM_EVALUATE_FLOAT_DECL( TranslateZ, ResTransformAnimData::FLAG_CONSTANT_TRANSLATE_Z ) // EvaluateTranslateZ(f32 frame) bit32 EvaluateResult( void* dstBuf, bit32 dstFlags, float frame, const void* originalTransform) const; void ApplyCache( void* target, const void* cacheBuf) const; }; //! @details :private class ResBakedTransformAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResBakedTransformAnim, ResMemberAnim ) /* ctor */ ResBakedTransformAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_BAKED_TRANSFORM ); } NW_RESANM_GETCURVE_DECL( ResVector4CurveData, Rotate, ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE | ResBakedTransformAnimData::FLAG_ROTATE_NOT_EXIST ) // GetRotate() NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Translate, ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE | ResBakedTransformAnimData::FLAG_TRANSLATE_NOT_EXIST ) // GetTranslate() NW_RESANM_GETCURVE_DECL( ResVector3CurveData, Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE | ResBakedTransformAnimData::FLAG_SCALE_NOT_EXIST ) // GetScale() NW_RESANM_EVALUATE_VEC3_DECL( Scale, ResBakedTransformAnimData::FLAG_CONSTANT_SCALE ) // EvaluateScale(math::VEC3* result, f32 frame) // これらは結果書き込み先と評価カーブが一致しない特殊なもの void EvaluateRotate( math::MTX34* result, bit32* flags, f32 frame ) const { float f = ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_ROTATE ) ? 0 : frame; CalcRotateCurve( result, flags, reinterpret_cast( ref().toRotate.to_ptr() ), f ); } void EvaluateTranslate( math::MTX34* result, bit32* flags, f32 frame ) const { float f = ( ref().m_Flags & ResBakedTransformAnimData::FLAG_CONSTANT_TRANSLATE ) ? 0 : frame; CalcTranslateCurve(result, flags, reinterpret_cast( ref().toTranslate.to_ptr() ), f ); } // データに焼き付けたフラグ情報を、CalculatedTransformに適用します。 static void ApplyBakedFlags(gfx::CalculatedTransform* transform, const bit32 flags); }; //! @details :private class ResFullBakedAnim : public ResMemberAnim { public: NW_RES_CTOR_INHERIT( ResFullBakedAnim, ResMemberAnim ) /* ctor */ ResFullBakedAnim( ResMemberAnim res ) : ResMemberAnim( res ) { NW_ASSERT( (!res.IsValid()) || res.GetPrimitiveType() == ResMemberAnim::PRIMITIVETYPE_FULL_BAKED ); } const ResFullBakedCurveData* GetTransform() const { return reinterpret_cast( ref().toTransform.to_ptr() ); } ResFullBakedCurveData* GetTransform() { return reinterpret_cast( ref().toTransform.to_ptr() ); } void EvaluateTransform( math::MTX34* result, f32 frame ) const { CalcTransformCurve( result, GetTransform(), frame ); } }; } /* namespace res */ } /* namespace anim */ } /* namespace nw */ #endif /* NW_ANIM_RESANIMATION_H_ */