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