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: 25986 $
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     static size_t GetMemorySize(
66         ResSkeleton resource,
67         int maxCallbacks,
68         size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT)
69     {
70         os::MemorySizeCalculator size(alignment);
71 
72         GetMemorySizeInternal(&size, resource, maxCallbacks);
73 
74         return size.GetSizeWithPadding(alignment);
75     }
76 
77     //! @details :private
GetMemorySizeInternal(os::MemorySizeCalculator * pSize,ResSkeleton resource,int maxCallbacks)78     static void GetMemorySizeInternal(
79         os::MemorySizeCalculator* pSize,
80         ResSkeleton resource,
81         int maxCallbacks)
82     {
83         // StandardSkeleton::Create
84         os::MemorySizeCalculator& size = *pSize;
85 
86         size += sizeof(StandardSkeleton);
87 #ifdef NW_MOVE_ARRAY_CACHE_LINE_ALIGNMENT_ENABLED
88         size.Add(sizeof(Skeleton::TransformPose::Transform) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
89         size.Add(sizeof(math::MTX34) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
90         size.Add(sizeof(math::MTX34) * resource.GetBonesCount(), Skeleton::TransformPose::TransformArray::MEMORY_ALIGNMENT);
91 #else
92         size += sizeof(Skeleton::TransformPose::Transform) * resource.GetBonesCount();
93         size += sizeof(math::MTX34) * resource.GetBonesCount();
94         size += sizeof(math::MTX34) * resource.GetBonesCount();
95 #endif
96         Skeleton::GetMemorySizeForConstruct(pSize, maxCallbacks);
97     }
98 
99     //@}
100 
101     //----------------------------------------
102     //! @name ポーズ
103     //@{
104 
105     //! @brief        ローカルトランスフォームのポーズを取得します。
106     //!
107     //! @return       ローカルトランスフォームのポーズです。
108     //!
LocalTransformPose()109     virtual TransformPose& LocalTransformPose() { return m_Pose; }
110 
111     //! @brief        ローカルトランスフォームのポーズを取得します。
112     //!
113     //! @return       ローカルトランスフォームのポーズです。
114     //!
LocalTransformPose()115     virtual const TransformPose& LocalTransformPose() const { return m_Pose; }
116 
117     //! @brief        ワールドトランスフォームのポーズを取得します。
118     //!
119     //! @return       ワールドトランスフォームのポーズです。
120     //!
WorldTransformPose()121     virtual TransformPose& WorldTransformPose() { return m_WorldTransformPose; }
122 
123     //! @brief        ワールドトランスフォームのポーズを取得します。
124     //!
125     //! @return       ワールドトランスフォームのポーズです。
126     //!
WorldTransformPose()127     virtual const TransformPose& WorldTransformPose() const { return m_WorldTransformPose; }
128 
129     //! @brief        ワールドマトリクスのポーズを取得します。
130     //!
131     //! @return       ワールドマトリクスのポーズです。
132     //!
WorldMatrixPose()133     virtual MatrixPose& WorldMatrixPose() { return m_WorldMatrixPose; }
134 
135     //! @brief        ワールドマトリクスのポーズを取得します。
136     //!
137     //! @return       ワールドマトリクスのポーズです。
138     //!
WorldMatrixPose()139     virtual const MatrixPose& WorldMatrixPose() const { return m_WorldMatrixPose; }
140 
141     //! @brief        スキニングマトリクスのポーズを取得します。
142     //!
143     //! @return       スキニングマトリクスのポーズです。
144     //!
SkiningMatrixPose()145     virtual MatrixPose& SkiningMatrixPose() { return m_SkiningMatrixPose; }
146 
147     //! @brief        スキニングマトリクスのポーズを取得します。
148     //!
149     //! @return       スキニングマトリクスのポーズです。
150     //!
SkiningMatrixPose()151     virtual const MatrixPose& SkiningMatrixPose() const { return m_SkiningMatrixPose; }
152 
153     //! @brief        オリジナルポーズを取得します。
154     //!
155     //! @return       オリジナルポーズです。
156     //!
LocalOriginalPose()157     virtual OriginalPose& LocalOriginalPose() { return m_OriginalPose; }
158 
159     //! @brief        オリジナルポーズを取得します。
160     //!
161     //! @return       オリジナルポーズです。
162     //!
LocalOriginalPose()163     virtual const OriginalPose& LocalOriginalPose() const { return m_OriginalPose; }
164 
165     //@}
166 
167 protected:
168     //----------------------------------------
169     //! @name コンストラクタ/デストラクタ
170     //@{
171 
172     //! コンストラクタです。
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)173     StandardSkeleton(
174         os::IAllocator* allocator,
175         ResSkeleton resource,
176         int maxCallbacks,
177         bool isFixedSizeMemory,
178         Skeleton::TransformPose::TransformArray poseTransforms,
179         Skeleton::TransformPose::TransformArray poseWorldTransforms,
180         Skeleton::MatrixPose::MatrixArray poseWorldMatrices,
181         Skeleton::MatrixPose::MatrixArray skiningMatrices)
182     : Skeleton(allocator, resource, maxCallbacks, isFixedSizeMemory),
183       m_Pose(poseTransforms),
184       m_WorldTransformPose(poseWorldTransforms),
185       m_WorldMatrixPose(poseWorldMatrices),
186       m_SkiningMatrixPose(skiningMatrices),
187       m_OriginalPose(resource)
188     {
189     }
190 
191     //! デストラクタです。
~StandardSkeleton()192     virtual ~StandardSkeleton()
193     {}
194 
195     //@}
196 
197 private:
198     TransformPose m_Pose;
199     TransformPose m_WorldTransformPose;
200     MatrixPose m_WorldMatrixPose;
201     MatrixPose m_SkiningMatrixPose;
202     OriginalPose m_OriginalPose;
203 };
204 
205 } // namespace gfx
206 } // namespace nw
207 
208 #endif // NW_GFX_STANDARDSKELETON_H_
209