/*---------------------------------------------------------------------------* Project: NintendoWare File: anim_ResAnimGroup.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. 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. $Revision: 19812 $ *---------------------------------------------------------------------------*/ #ifndef NW_ANIM_RESANIMATIONGROUP_H_ #define NW_ANIM_RESANIMATIONGROUP_H_ #include #include #include #include #include #include #include namespace nw { namespace gfx { class SkeletalModel; class Model; class Camera; class Light; namespace res { class ResModel; } } } namespace nw { namespace anim { namespace res {} using namespace ::nw::anim::res; namespace res { //! アニメーション対象メンバの情報です。 //! //! ObjectTypeとMemberTypeで、対象メンバを特定します。 //! アニメーション対象のクラスごとに、派生クラス(Res~Member)が存在します。(ObjectTypeと1対1対応) //! 各派生クラスに、アニメーション対象インスタンスを特定するための情報があります。 //! //! :private struct ResAnimGroupMemberData { nw::ut::ResTypeInfo typeInfo; ut::BinString toPath; ut::BinString toTargetName; // TODO: MemberTypeの実装が完了したら削除 ut::BinString toBaseObjectPath; // TODO: MemberTypeの実装が完了したら削除 ut::ResS32 m_MemberOffset; // TODO: MemberTypeの実装が完了したら削除?コード量が増えるので残してもよさそう ut::ResS32 m_MemberSize; // TODO: 正しい値が入っていない。未使用のようなので、確認して削除 ut::ResS32 m_BlendOperationIndex; ut::ResU32 m_ObjectType; //!< ResAnimGroupMember::ObjectType型の値。派生クラスの型を表す ut::ResU32 m_MemberType; //!< 各派生クラスのMemberType型の値 // TODO: マテリアルのハッシュをクリアするためのハック。 // ハッシュ機構が削除されたら合わせて削除。 ut::ResU32 m_ResMaterialPtr; }; //! @details :private struct ResBoneMemberData : public ResAnimGroupMemberData { ut::BinString toBoneName; }; //! @details :private struct ResMaterialColorMemberData : public ResAnimGroupMemberData { ut::BinString toMaterialName; }; //! @details :private struct ResTextureSamplerMemberData : public ResAnimGroupMemberData { ut::BinString toMaterialName; ut::ResU32 m_TextureMapperIndex; }; //! @details :private struct ResTextureMapperMemberData : public ResAnimGroupMemberData { ut::BinString toMaterialName; ut::ResU32 m_TextureMapperIndex; }; //! @details :private struct ResBlendOperationMemberData : public ResAnimGroupMemberData { ut::BinString toMaterialName; }; //! @details :private struct ResTextureCoordinatorMemberData : public ResAnimGroupMemberData { ut::BinString toMaterialName; ut::ResU32 m_TextureCoordinatorIndex; }; //! @details :private struct ResModelMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResMeshMemberData : public ResAnimGroupMemberData { ut::ResU32 m_MeshIndex; }; //! @details :private struct ResMeshNodeVisibilityMemberData : public ResAnimGroupMemberData { ut::BinString toNodeName; }; //! @details :private struct ResTransformMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResViewUpdaterMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResProjectionUpdaterMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResLightMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResFragmentLightMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResAmbientLightMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResVertexLightMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResHemiSphereLightMemberData : public ResAnimGroupMemberData { }; //! @details :private struct ResAnimGroupData { nw::ut::ResTypeInfo typeInfo; ut::ResU32 m_Flags; ut::BinString toName; ut::ResS32 m_TargetType; ut::ResS32 m_MemberInfoSetDicCount; ut::Offset toMemberInfoSetDic; ut::ResS32 m_BlendOperationsTableCount; ut::Offset toBlendOperationsTable; }; //! @details :private struct ResGraphicsAnimGroupData : public ResAnimGroupData { ut::ResS32 m_EvaluationTiming; }; //! @brief アニメーション対象のデータメンバーを書き換えるための情報のリソースクラスです。 //! //! アニメーション対象のオブジェクトと、そのうちのどのメンバーをアニメーションさせるかの情報を持ちます。 //! 各アニメーション対象に応じて、継承先のクラスが定義されています。 //! class ResAnimGroupMember : public ut::ResCommon { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnimGroupMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGMB') }; //! アニメーション対象のオブジェクトです。 enum ObjectType { // スケルタルアニメーション OBJECT_TYPE_BONE, // マテリアルアニメーション OBJECT_TYPE_MATERIAL_COLOR, OBJECT_TYPE_TEXTURE_SAMPLER, OBJECT_TYPE_TEXTURE_MAPPER, OBJECT_TYPE_BLEND_OPERATION, OBJECT_TYPE_TEXTURE_COORDINATOR, // ビジビリティアニメーション OBJECT_TYPE_MODEL, OBJECT_TYPE_MESH, OBJECT_TYPE_MESH_NODE_VISIBILITY, // トランスフォームアニメーション OBJECT_TYPE_TRANSFORM, // カメラアニメーション OBJECT_TYPE_VIEW_UPDATER, OBJECT_TYPE_PROJECTION_UPDATER, // ライトアニメーション OBJECT_TYPE_LIGHT, OBJECT_TYPE_FRAGMENT_LIGHT, OBJECT_TYPE_VERTEX_LIGHT, OBJECT_TYPE_HEMISPHERE_LIGHT, OBJECT_TYPE_AMBIENT_LIGHT }; //! オブジェクト中の、どのメンバーをアニメーションさせるかの列挙です。継承先でも定義されます。 enum MemberType { // SetValueで処理が必要ない場合は、この値を使用します。 MEMBER_TYPE_INVALID = 0xFFFFFFFF }; NW_RES_CTOR( ResAnimGroupMember ) //! @name リソースへのアクセス //! @{ NW_RES_FIELD_STRING_DECL( Path ) // GetPath() NW_DEPRECATED_FUNCTION(const char* GetTargetName() const) { return ref().toTargetName.to_ptr(); } NW_DEPRECATED_FUNCTION(const char* GetBaseObjectPath() const) { return ref().toBaseObjectPath.to_ptr(); } NW_RES_FIELD_PRIMITIVE_DECL( s32, MemberOffset ) // GetMemberOffset() NW_RES_FIELD_PRIMITIVE_DECL( s32, MemberSize ) // GetMemberSize() NW_RES_FIELD_PRIMITIVE_DECL( s32, BlendOperationIndex ) // GetBlendOperationIndex() NW_RES_FIELD_PRIMITIVE_DECL( u32, ObjectType ) // GetObjectType() NW_RES_FIELD_PRIMITIVE_DECL( u32, MemberType ) // GetMemberType() NW_RES_FIELD_PRIMITIVE_DECL( u32, ResMaterialPtr ) // GetResMaterialPtr() //! @} //! @brief アニメーション対象メンバに値を設定します。 //! @param[in] object AnimGroup::GetTargetObject()の値です。 //! @param[in] value 設定する値です。メンバの種類で型が異なります。派生クラスを参照してください。 void SetValueForType(void* object, const void* value) const; //--------------------------------------------------------------------------- //! @brief リソースの型情報を取得します。 //! //! @return 型情報です。 //--------------------------------------------------------------------------- nw::ut::ResTypeInfo GetTypeInfo() const { return ref().typeInfo; } }; typedef nw::ut::ResArrayPatricia::type ResAnimGroupMemberArray; //!< @details :private typedef nw::ut::ResArrayPatricia::type ResAnimGroupMemberArrayConst; //!< @details :private //! @details :private class ResBoneMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResBoneMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGBM') }; enum MemberType { MEMBER_TYPE_TRANSFORM }; NW_RES_CTOR_INHERIT( ResBoneMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( BoneName ) // GetBoneName() // object: gfx::CalculatedTransform // value: math::Transform3 void SetValue(void* object, const void* value) const; }; //! @details :private class ResMaterialColorMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMaterialColorMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGMC') }; enum MemberType { MEMBER_TYPE_EMISSION, // ResMaterialColor::SetEmission() MEMBER_TYPE_AMBIENT, // ResMaterialColor::SetAmbient() MEMBER_TYPE_DIFFUSE, // ResMaterialColor::SetDiffuse() MEMBER_TYPE_SPECULAR0, // ResMaterialColor::SetSpecular0() MEMBER_TYPE_SPECULAR1, // ResMaterialColor::SetSpecular1() MEMBER_TYPE_CONSTANT0, // ResMaterialColor::SetConstant0() MEMBER_TYPE_CONSTANT1, // ResMaterialColor::SetConstant1() MEMBER_TYPE_CONSTANT2, // ResMaterialColor::SetConstant2() MEMBER_TYPE_CONSTANT3, // ResMaterialColor::SetConstant3() MEMBER_TYPE_CONSTANT4, // ResMaterialColor::SetConstant4() MEMBER_TYPE_CONSTANT5 // ResMaterialColor::SetConstant5() }; NW_RES_CTOR_INHERIT( ResMaterialColorMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName() // object: gfx::ResMaterialColorData // value: ut::FloatColor void SetValue(void* object, const void* value) const; }; //! @details :private class ResTextureSamplerMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureSamplerMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGTS') }; enum MemberType { MEMBER_TYPE_BORDER_COLOR // ResStandardTextureSampler::SetBorderColor(), ResPixelBasedTextureMapper::SetSampler() }; NW_RES_CTOR_INHERIT( ResTextureSamplerMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMapperIndex ) // GetTextureMapperIndex() // object: gfx::ResPixelBasedTextureMapperData // value: ut::FloatColor void SetValue(void* object, const void* value) const; }; //! @details :private class ResTextureMapperMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureMapperMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGTM') }; enum MemberType { MEMBER_TYPE_TEXTURE // ResTextureMapper::SetTexture() }; NW_RES_CTOR_INHERIT( ResTextureMapperMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMapperIndex ) // GetTextureMapperIndex() // object: gfx::ResPixelBasedTextureMapperData // value: ut::Offset (ResReferenceTextureへの参照) void SetValue(void* object, const void* value) const; }; //! @details :private class ResBlendOperationMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResBlendOperationMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGBO') }; enum MemberType { MEMBER_TYPE_BLEND_COLOR // ResBlendOperation::SetBlendColor() }; NW_RES_CTOR_INHERIT( ResBlendOperationMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName() // object: gfx::ResBlendOperationData // value: ut::FloatColor void SetValue(void* object, const void* value) const; }; //! @details :private class ResTextureCoordinatorMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTextureCoordinatorMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGTC') }; enum MemberType { MEMBER_TYPE_SCALE, // ResTextureCoordinator::SetScale() MEMBER_TYPE_ROTATE, // ResTextureCoordinator::SetRotate() MEMBER_TYPE_TRANSLATE // ResTextureCoordinator::SetTranslate() }; NW_RES_CTOR_INHERIT( ResTextureCoordinatorMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( MaterialName ) // GetMaterialName() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCoordinatorIndex ) // GetTextureCoordinatorIndex() // object: gfx::ResTextureCoordinatorData // value: // SCALE, TRANSLATE: math::VEC2 // ROTATE: float void SetValue(void* object, const void* value) const; }; //! @details :private class ResModelMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResModelMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGMO') }; enum MemberType { MEMBER_TYPE_BRANCH_VISIBLE, MEMBER_TYPE_VISIBLE }; NW_RES_CTOR_INHERIT( ResModelMember, ResAnimGroupMember ) // object: gfx::ResModelData // value: bool void SetValue(void* object, const void* value) const; }; //! @details :private class ResMeshMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMeshMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGME') }; enum MemberType { MEMBER_TYPE_VISIBLE }; NW_RES_CTOR_INHERIT( ResMeshMember, ResAnimGroupMember ) NW_RES_FIELD_PRIMITIVE_DECL( u32, MeshIndex ) // GetMeshIndex() // object: gfx::ResMeshData // value: bool void SetValue(void* object, const void* value) const; }; //! @details :private class ResMeshNodeVisibilityMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResMeshNodeVisibilityMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGND') }; enum MemberType { MEMBER_TYPE_VISIBLE }; NW_RES_CTOR_INHERIT( ResMeshNodeVisibilityMember, ResAnimGroupMember ) NW_RES_FIELD_STRING_DECL( NodeName ) // GetNodeName() // object: gfx::ResMeshNodeVisibilityData // value: bool void SetValue(void* object, const void* value) const; }; //! @details :private class ResTransformMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResTransformMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGTF') }; enum MemberType { MEMBER_TYPE_TRANSFORM }; NW_RES_CTOR_INHERIT( ResTransformMember, ResAnimGroupMember ) // object: gfx::TransformNode // value: CalculatedTransform void SetValue(void* object, const void* value) const; }; //! @details :private class ResViewUpdaterMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResViewUpdaterMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGVU') }; enum MemberType { MEMBER_TYPE_TARGET_POSITION, MEMBER_TYPE_TWIST, MEMBER_TYPE_UPWARD_VECTOR, MEMBER_TYPE_VIEW_ROTATE, MEMBER_TYPE_TRANSFORM }; NW_RES_CTOR_INHERIT( ResViewUpdaterMember, ResAnimGroupMember ) // object: gfx::ResCameraViewUpdaterData // value: 多様なので実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResProjectionUpdaterMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResProjectionUpdaterMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGPU') }; enum MemberType { MEMBER_TYPE_NEAR, MEMBER_TYPE_FAR, MEMBER_TYPE_FOVY, MEMBER_TYPE_ASPECT_RATIO, MEMBER_TYPE_HEIGHT, MEMBER_TYPE_CENTER }; NW_RES_CTOR_INHERIT( ResProjectionUpdaterMember, ResAnimGroupMember ) // object: gfx::ResCameraProjectionUpdaterData // value: 多様なので実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResLightMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') }; enum MemberType { MEMBER_TYPE_IS_LIGHT_ENABLED }; NW_RES_CTOR_INHERIT( ResLightMember, ResAnimGroupMember ) // object: gfx::ResLightData // value: 実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResFragmentLightMember : public ResAnimGroupMember { public: // このクラスは実装上の都合で存在している。 // バイナリにはResLightMember型で格納されている。以下同様。 enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') }; enum MemberType { MEMBER_TYPE_AMBIENT, MEMBER_TYPE_DIFFUSE, MEMBER_TYPE_SPECULAR0, MEMBER_TYPE_SPECULAR1, MEMBER_TYPE_DIRECTION, MEMBER_TYPE_DISTANCE_ATTENUATION_START, MEMBER_TYPE_DISTANCE_ATTENUATION_END }; NW_RES_CTOR_INHERIT( ResFragmentLightMember, ResAnimGroupMember ) // object: gfx::ResFragmentLightData // value: 実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResAmbientLightMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') }; enum MemberType { MEMBER_TYPE_AMBIENT }; NW_RES_CTOR_INHERIT( ResAmbientLightMember, ResAnimGroupMember ) // object: gfx::ResAmbientLightData // value: 実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResVertexLightMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') }; enum MemberType { MEMBER_TYPE_AMBIENT, MEMBER_TYPE_DIFFUSE, MEMBER_TYPE_DIRECTION, MEMBER_TYPE_DISTANCE_ATTENUATION_CONSTANT, MEMBER_TYPE_DISTANCE_ATTENUATION_LINEAR, MEMBER_TYPE_DISTANCE_ATTENUATION_QUADRATIC, MEMBER_TYPE_SPOT_EXPONENT, MEMBER_TYPE_SPOT_CUTOFF_ANGLE }; NW_RES_CTOR_INHERIT( ResVertexLightMember, ResAnimGroupMember ) // object: gfx::ResVertexLightData // value: 実装を参照 void SetValue(void* object, const void* value) const; }; //! @details :private class ResHemiSphereLightMember : public ResAnimGroupMember { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResLightMember) }; enum { SIGNATURE = NW_RES_SIGNATURE32('AGLM') }; enum MemberType { MEMBER_TYPE_GROUND_COLOR, MEMBER_TYPE_SKY_COLOR, MEMBER_TYPE_DIRECTION, MEMBER_TYPE_LERP_FACTOR }; NW_RES_CTOR_INHERIT( ResHemiSphereLightMember, ResAnimGroupMember ) // object: gfx::ResHemiSphereLightData // value: 実装を参照 void SetValue(void* object, const void* value) const; }; //! @brief アニメーション対象の情報をまとめたリソースクラスです。 //! class ResAnimGroup : public ut::ResCommon { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResAnimGroup) }; enum { SIGNATURE = NW_RES_SIGNATURE32('ANMG') }; //! アニメーションのブレンド種類です。 enum BlendOperationType { BLENDOP_BOOL, BLENDOP_INT, BLENDOP_FLOAT, BLENDOP_RGBA_COLOR, BLENDOP_TRANSFORM, BLENDOP_VECTOR2, BLENDOP_VECTOR3, BLENDOP_TEXTURE, BLENDOP_CALCULATED_TRANSFORM, BLENDOP_CALCULATED_TRANSFORM_QUAT, BLENDOP_CALCULATED_TRANSFORM_ACCURATE_SCALE, BLENDOP_CALCULATED_TRANSFORM_ACCURATE_SCALE_QUAT }; //! アニメーション対象の種類です。継承先でさらに定義されます。 enum TargetType { TARGET_TYPE_NONE = 0, //!< 有効なメンバが存在しません。 TARGET_TYPE_UNKNOWN = -1 //!< 不正なメンバタイプです。 }; //! アニメーション対象のフラグです。 enum Flag { FLAG_IS_CALCULATED_TRANSFORM = 0x1 << 0 //!< ベイクされたTransformのアニメーションであることを示します。 }; NW_RES_CTOR( ResAnimGroup ) //! @name リソースへのアクセス //! @{ NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags ) // GetFlags() NW_RES_FIELD_STRING_DECL( Name ) // GetName() NW_RES_FIELD_PRIMITIVE_DECL( s32, TargetType ) // GetMemberType() NW_RES_FIELD_CLASS_DIC_DECL( ResAnimGroupMember, MemberInfoSet, ut::ResDicPatricia ) // GetMemberInfoSet(int), GetMemberInfoSet(const char*), GetMemberInfoSetIndex(const char*), GetMemberInfoSetCount() NW_RES_FIELD_PRIMITIVE_LIST_DECL( s32, BlendOperations ) // GetBlendOperations(), GetBlendOperations(int), GetBlendOperationsCount() //! @} }; //! @details :private class ResGraphicsAnimGroup : public ResAnimGroup { public: enum { TYPE_INFO = NW_ANIM_RES_TYPE_INFO(ResGraphicsAnimGroup) }; enum { SIGNATURE = NW_RES_SIGNATURE32('GXAG') }; enum TargetType { TARGET_TYPE_BONE = 1, //!< ボーンに対するメンバです。 TARGET_TYPE_MATERIAL = 2, //!< マテリアルに対するメンバです。 TARGET_TYPE_VISIBILITY = 3, //!< ビジビリティに対するメンバです。 TARGET_TYPE_LIGHT = 4, //!< ライトに対するメンバです。 TARGET_TYPE_CAMERA = 5, //!< カメラに対するメンバです。 TARGET_TYPE_FOG = 6 //!< フォグに対するメンバです。 }; //! アニメーションの評価タイミングを表します。 enum EvaluationTiming { EVALUATION_BEFORE_WORLD_UPDATE, //!< シーンのワールドマトリクスを更新する前に評価されます。 EVALUATION_AFTER_SCENE_CULLING //!< シーンの描画カリングを行った後に評価されます。(描画カリングは今後実装予定です) }; NW_RES_CTOR_INHERIT( ResGraphicsAnimGroup, ResAnimGroup ) NW_RES_FIELD_PRIMITIVE_DECL( EvaluationTiming, EvaluationTiming ) }; } /* namespace res */ } /* namespace anim */ } /* namespace nw */ #endif /* NW_UT_RESANIMATIONGROUP_H_ */