1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_StandardSkeleton.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NW_GFX_STANDARDSKELETON_H_
19 #define NW_GFX_STANDARDSKELETON_H_
20 
21 #include <nw/gfx/gfx_Skeleton.h>
22 #include <nw/gfx/res/gfx_ResSkeleton.h>
23 
24 namespace nw
25 {
26 namespace gfx
27 {
28 
29 //---------------------------------------------------------------------------
30 //! @brief        SkeletalModel 内の階層構造を表すクラスです。
31 //!
32 //! Skeleton は StandardSkeleton に変更されました。
33 //---------------------------------------------------------------------------
34 class StandardSkeleton  : public Skeleton
35 {
36 private:
37     NW_DISALLOW_COPY_AND_ASSIGN(StandardSkeleton);
38 
39 public:
40     NW_UT_RUNTIME_TYPEINFO;
41 
42     //----------------------------------------
43     //! @name 作成/破棄
44     //@{
45 
46     //! @brief        スケルトンを生成します。
47     //!
48     //! @param[in]    resource リソースです。
49     //! @param[in]    maxCallbacks コールバックの最大数です。
50     //! @param[in]    isFixedSizeMemory 固定サイズのメモリで生成するかを表すフラグです。
51     //! @param[in]    poseTransforms ポーズ用のトランスフォームリストです。
52     //! @param[in]    allocator アロケータです。
53     //!
54     static StandardSkeleton* Create(
55         ResSkeleton resource,
56         int maxCallbacks,
57         bool isFixedSizeMemory,
58         Skeleton::TransformPose::TransformArray poseTransforms,
59         os::IAllocator* allocator
60     );
61 
62 
63     //! @brief   生成時に必要なメモリサイズを取得します。
64     //!
65     //! @param[in]    resource リソースです。
66     //! @param[in]    maxCallbacks コールバックの最大数です。
67     //! @param[in]    alignment 計算に用いるアライメントです。2 のべき乗である必要があります。
68     static size_t GetMemorySize(
69         ResSkeleton resource,
70         int maxCallbacks,
71         size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT)
72     {
73         os::MemorySizeCalculator size(alignment);
74 
75         GetMemorySizeInternal(&size, resource, maxCallbacks);
76 
77         return size.GetSizeWithPadding(alignment);
78     }
79 
80     //! @details :private
GetMemorySizeInternal(os::MemorySizeCalculator * pSize,ResSkeleton resource,int maxCallbacks)81     static void GetMemorySizeInternal(
82         os::MemorySizeCalculator* pSize,
83         ResSkeleton resource,
84         int maxCallbacks)
85     {
86         // StandardSkeleton::Create
87         os::MemorySizeCalculator& size = *pSize;
88 
89         size += sizeof(StandardSkeleton);
90 #ifdef NW_MOVE_ARRAY_CACHE_LINE_ALIGNMENT_ENABLED
91         size.Add(sizeof(Skeleton::TransformPose::Transform) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
92         size.Add(sizeof(math::MTX34) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
93         size.Add(sizeof(math::MTX34) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
94 #else
95         size += sizeof(Skeleton::TransformPose::Transform) * resource.GetBonesCount();
96         size += sizeof(math::MTX34) * resource.GetBonesCount();
97         size += sizeof(math::MTX34) * resource.GetBonesCount();
98 #endif
99         Skeleton::GetMemorySizeForConstruct(pSize, maxCallbacks);
100     }
101 
102     //@}
103 
104     //----------------------------------------
105     //! @name ポーズ
106     //@{
107 
108     //! @brief        ローカルトランスフォームのポーズを取得します。
109     //!
110     //! @return       ローカルトランスフォームのポーズです。
111     //!
LocalTransformPose()112     virtual TransformPose& LocalTransformPose() { return m_Pose; }
113 
114     //! @brief        ローカルトランスフォームのポーズを取得します。
115     //!
116     //! @return       ローカルトランスフォームのポーズです。
117     //!
LocalTransformPose()118     virtual const TransformPose& LocalTransformPose() const { return m_Pose; }
119 
120     //! @brief        ワールドトランスフォームのポーズを取得します。
121     //!
122     //! @return       ワールドトランスフォームのポーズです。
123     //!
WorldTransformPose()124     virtual TransformPose& WorldTransformPose() { return m_WorldTransformPose; }
125 
126     //! @brief        ワールドトランスフォームのポーズを取得します。
127     //!
128     //! @return       ワールドトランスフォームのポーズです。
129     //!
WorldTransformPose()130     virtual const TransformPose& WorldTransformPose() const { return m_WorldTransformPose; }
131 
132     //! @brief        ワールドマトリクスのポーズを取得します。
133     //!
134     //! @return       ワールドマトリクスのポーズです。
135     //!
WorldMatrixPose()136     virtual MatrixPose& WorldMatrixPose() { return m_WorldMatrixPose; }
137 
138     //! @brief        ワールドマトリクスのポーズを取得します。
139     //!
140     //! @return       ワールドマトリクスのポーズです。
141     //!
WorldMatrixPose()142     virtual const MatrixPose& WorldMatrixPose() const { return m_WorldMatrixPose; }
143 
144     //! @brief        スキニングマトリクスのポーズを取得します。
145     //!
146     //! @return       スキニングマトリクスのポーズです。
147     //!
SkiningMatrixPose()148     virtual MatrixPose& SkiningMatrixPose() { return m_SkiningMatrixPose; }
149 
150     //! @brief        スキニングマトリクスのポーズを取得します。
151     //!
152     //! @return       スキニングマトリクスのポーズです。
153     //!
SkiningMatrixPose()154     virtual const MatrixPose& SkiningMatrixPose() const { return m_SkiningMatrixPose; }
155 
156     //! @brief        オリジナルポーズを取得します。
157     //!
158     //! @return       オリジナルポーズです。
159     //!
LocalOriginalPose()160     virtual OriginalPose& LocalOriginalPose() { return m_OriginalPose; }
161 
162     //! @brief        オリジナルポーズを取得します。
163     //!
164     //! @return       オリジナルポーズです。
165     //!
LocalOriginalPose()166     virtual const OriginalPose& LocalOriginalPose() const { return m_OriginalPose; }
167 
168     //@}
169 
170 protected:
171     //----------------------------------------
172     //! @name コンストラクタ/デストラクタ
173     //@{
174 
175     //! コンストラクタです。
StandardSkeleton(os::IAllocator * allocator,ResSkeleton resource,int maxCallbacks,bool isFixedSizeMemory,Skeleton::TransformPose::TransformArray poseTransforms,Skeleton::TransformPose::TransformArray poseWorldTransforms,Skeleton::MatrixPose::MatrixArray poseWorldMatrices,Skeleton::MatrixPose::MatrixArray skiningMatrices)176     StandardSkeleton(
177         os::IAllocator* allocator,
178         ResSkeleton resource,
179         int maxCallbacks,
180         bool isFixedSizeMemory,
181         Skeleton::TransformPose::TransformArray poseTransforms,
182         Skeleton::TransformPose::TransformArray poseWorldTransforms,
183         Skeleton::MatrixPose::MatrixArray poseWorldMatrices,
184         Skeleton::MatrixPose::MatrixArray skiningMatrices)
185     : Skeleton(allocator, resource, maxCallbacks, isFixedSizeMemory),
186       m_Pose(poseTransforms),
187       m_WorldTransformPose(poseWorldTransforms),
188       m_WorldMatrixPose(poseWorldMatrices),
189       m_SkiningMatrixPose(skiningMatrices),
190       m_OriginalPose(resource)
191     {
192     }
193 
194     //! デストラクタです。
~StandardSkeleton()195     virtual ~StandardSkeleton()
196     {}
197 
198     //@}
199 
200 private:
201     TransformPose m_Pose;
202     TransformPose m_WorldTransformPose;
203     MatrixPose m_WorldMatrixPose;
204     MatrixPose m_SkiningMatrixPose;
205     OriginalPose m_OriginalPose;
206 };
207 
208 } // namespace gfx
209 } // namespace nw
210 
211 #endif // NW_GFX_STANDARDSKELETON_H_
212