1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_ResParticleInitializer.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: 19592 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_GFX_RESPARTICLEINITIALIZER_H_
17 #define NW_GFX_RESPARTICLEINITIALIZER_H_
18 
19 #include <nw/ut/ut_ResUtil.h>
20 #include <nw/ut/ut_ResDictionary.h>
21 #include <nw/ut/ut_Color.h>
22 #include <nw/gfx/res/gfx_ResParticleUpdater.h>
23 #include <nw/gfx/res/gfx_ResTypeInfo.h>
24 
25 namespace nw {
26 namespace gfx {
27 namespace res {
28 
29 //! @details :private
30 struct ResParticleInitializerData
31 {
32     nw::ut::ResTypeInfo typeInfo;
33     nw::ut::ResBool m_IsResourceCopyEnabled;
34     nw::ut::ResBool m_InitializerEnabled;
35     u8              padding_0[2];
36     nw::ut::ResS32 m_TargetStream;
37 };
38 
39 
40 //--------------------------------------------------------------------------
41 //! @brief  パーティクルイニシャライザを表すバイナリリソースクラスです(基底クラス)。
42 //---------------------------------------------------------------------------
43 class ResParticleInitializer : public nw::ut::ResCommon< ResParticleInitializerData >
44 {
45 public:
46     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleInitializer) };
47     enum { SIGNATURE = NW_RES_SIGNATURE32('INIT') };
48 
49     NW_RES_CTOR( ResParticleInitializer )
50 
NW_RES_FIELD_PRIMITIVE_DECL(bool,IsResourceCopyEnabled)51     NW_RES_FIELD_PRIMITIVE_DECL( bool, IsResourceCopyEnabled )
52     NW_RES_FIELD_PRIMITIVE_DECL( bool, InitializerEnabled )
53     NW_RES_FIELD_PRIMITIVE_DECL( ParticleUsage, TargetStream )
54 
55     //---------------------------------------------------------------------------
56     //! @brief        インスタンスの型情報を取得します。
57     //!
58     //! @return       型情報です。
59     //---------------------------------------------------------------------------
60     nw::ut::ResTypeInfo     GetTypeInfo() const { return ref().typeInfo; }
61 };
62 
63 //! @details :private
64 struct ResParticleDirectionalVelocityInitializerData : public ResParticleInitializerData
65 {
66     nw::ut::ResF32 m_Power;
67     nw::ut::ResVec3 m_Direction;
68 };
69 
70 
71 //--------------------------------------------------------------------------
72 //! @brief  パーティクル放出方向と速度を表すバイナリリソースクラスです。
73 //---------------------------------------------------------------------------
74 class ResParticleDirectionalVelocityInitializer : public ResParticleInitializer
75 {
76 public:
77     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleDirectionalVelocityInitializer) };
78     enum { SIGNATURE = NW_RES_SIGNATURE32('DIRV') };
79 
80     NW_RES_CTOR_INHERIT( ResParticleDirectionalVelocityInitializer, ResParticleInitializer )
81 
82     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power )             // GetPower(), SetPower()
83     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Direction ) // GetDirection()
84 };
85 
86 
87 //! @details :private
88 struct ResParticleRandomDirectionalVelocityInitializerData : public ResParticleInitializerData
89 {
90     nw::ut::ResF32 m_Power;
91     nw::ut::ResVec3 m_Direction;
92     nw::ut::ResF32 m_Angle;
93 };
94 
95 
96 
97 //--------------------------------------------------------------------------
98 //! @brief  ランダムなパーティクル放出方向と速度を表すバイナリリソースクラスです。
99 //---------------------------------------------------------------------------
100 class ResParticleRandomDirectionalVelocityInitializer : public ResParticleInitializer
101 {
102 public:
103     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleRandomDirectionalVelocityInitializer) };
104     enum { SIGNATURE = NW_RES_SIGNATURE32('RDRV') };
105 
106     NW_RES_CTOR_INHERIT( ResParticleRandomDirectionalVelocityInitializer, ResParticleInitializer )
107 
108     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power )               // GetPower(), SetPower()
109     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Direction )  // GetDirection()
110     NW_RES_FIELD_PRIMITIVE_DECL( f32, Angle )               // GetAngle(), SetAngle()
111 };
112 
113 
114 //! @details :private
115 struct ResParticleOriginVelocityInitializerData : public ResParticleInitializerData
116 {
117     nw::ut::ResF32 m_Power;
118 };
119 
120 
121 //--------------------------------------------------------------------------
122 //! @brief  パーティクルの原点から拡散する速度を表すバイナリリソースクラスです。
123 //---------------------------------------------------------------------------
124 class ResParticleOriginVelocityInitializer : public ResParticleInitializer
125 {
126 public:
127     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleOriginVelocityInitializer) };
128     enum { SIGNATURE = NW_RES_SIGNATURE32('ORIV') };
129 
130     NW_RES_CTOR_INHERIT( ResParticleOriginVelocityInitializer, ResParticleInitializer )
131 
132     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
133 };
134 
135 //! @details :private
136 struct ResParticleRandomVelocityInitializerData : public ResParticleInitializerData
137 {
138     nw::ut::ResF32 m_Power;
139 };
140 
141 
142 //--------------------------------------------------------------------------
143 //! @brief  パーティクルのランダムな速度を表すバイナリリソースクラスです。
144 //---------------------------------------------------------------------------
145 class ResParticleRandomVelocityInitializer : public ResParticleInitializer
146 {
147 public:
148     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleRandomVelocityInitializer) };
149     enum { SIGNATURE = NW_RES_SIGNATURE32('RNDV') };
150 
151     NW_RES_CTOR_INHERIT( ResParticleRandomVelocityInitializer, ResParticleInitializer )
152 
153     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
154 };
155 
156 //! @details :private
157 struct ResParticleYAxisVelocityInitializerData : public ResParticleInitializerData
158 {
159     nw::ut::ResF32 m_Power;
160 };
161 
162 
163 //--------------------------------------------------------------------------
164 //! @brief  パーティクルのY軸から拡散する速度を表すバイナリリソースクラスです。
165 //---------------------------------------------------------------------------
166 class ResParticleYAxisVelocityInitializer : public ResParticleInitializer
167 {
168 public:
169     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleYAxisVelocityInitializer) };
170     enum { SIGNATURE = NW_RES_SIGNATURE32('YAXV') };
171 
172     NW_RES_CTOR_INHERIT( ResParticleYAxisVelocityInitializer, ResParticleInitializer )
173 
174         NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
175 };
176 
177 //! @details :private
178 struct ResParticleFloatRandomInitializerData : public ResParticleInitializerData
179 {
180     nw::ut::ResF32 m_BaseValue;
181     nw::ut::ResF32 m_Random;
182 };
183 
184 
185 //--------------------------------------------------------------------------
186 //! @brief  f32を乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
187 //---------------------------------------------------------------------------
188 class ResParticleFloatRandomInitializer : public ResParticleInitializer
189 {
190 public:
191     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatRandomInitializer) };
192     enum { SIGNATURE = NW_RES_SIGNATURE32('FRND') };
193 
194     NW_RES_CTOR_INHERIT( ResParticleFloatRandomInitializer, ResParticleInitializer )
195 
196     NW_RES_FIELD_PRIMITIVE_DECL( f32, BaseValue )
197     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
198 };
199 
200 //! @details :private
201 struct ResParticleFloatRangeRandomInitializerData : public ResParticleInitializerData
202 {
203     nw::ut::ResF32 m_MaxValue;
204     nw::ut::ResF32 m_MinValue;
205 };
206 
207 
208 
209 //--------------------------------------------------------------------------
210 //! @brief  f32を範囲指定の乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
211 //---------------------------------------------------------------------------
212 class ResParticleFloatRangeRandomInitializer : public ResParticleInitializer
213 {
214 public:
215     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatRangeRandomInitializer) };
216     enum { SIGNATURE = NW_RES_SIGNATURE32('URRA') };
217 
218     NW_RES_CTOR_INHERIT( ResParticleFloatRangeRandomInitializer, ResParticleInitializer )
219 
220     NW_RES_FIELD_PRIMITIVE_DECL( f32, MaxValue )
221     NW_RES_FIELD_PRIMITIVE_DECL( f32, MinValue )
222 };
223 
224 //! @details :private
225 struct ResParticleFloatImmediateInitializerData : public ResParticleInitializerData
226 {
227     nw::ut::ResF32 m_ImmediateValue;
228 };
229 
230 //--------------------------------------------------------------------------
231 //! @brief  f32を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
232 //---------------------------------------------------------------------------
233 class ResParticleFloatImmediateInitializer : public ResParticleInitializer
234 {
235 public:
236     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatImmediateInitializer) };
237     enum { SIGNATURE = NW_RES_SIGNATURE32('SFIM') };
238 
239     NW_RES_CTOR_INHERIT( ResParticleFloatImmediateInitializer, ResParticleInitializer )
240 
241     NW_RES_FIELD_PRIMITIVE_DECL( f32, ImmediateValue )
242 };
243 
244 //! @details :private
245 struct ResParticleVector2ImmediateInitializerData : public ResParticleInitializerData
246 {
247     nw::ut::ResVec2 m_ImmediateValue;
248 };
249 
250 
251 //--------------------------------------------------------------------------
252 //! @brief  Vector2を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
253 //---------------------------------------------------------------------------
254 class ResParticleVector2ImmediateInitializer : public ResParticleInitializer
255 {
256 public:
257     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector2ImmediateInitializer) };
258     enum { SIGNATURE = NW_RES_SIGNATURE32('V2IM') };
259 
260     NW_RES_CTOR_INHERIT( ResParticleVector2ImmediateInitializer, ResParticleInitializer )
261 
262     NW_RES_FIELD_VECTOR2_DECL( nw::math::VEC2, ImmediateValue )
263 };
264 
265 //! @details :private
266 struct ResParticleVector3ImmediateInitializerData : public ResParticleInitializerData
267 {
268     nw::ut::ResVec3 m_ImmediateValue;
269 };
270 
271 
272 //--------------------------------------------------------------------------
273 //! @brief  Vectro3を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
274 //---------------------------------------------------------------------------
275 class ResParticleVector3ImmediateInitializer : public ResParticleInitializer
276 {
277 public:
278     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3ImmediateInitializer) };
279     enum { SIGNATURE = NW_RES_SIGNATURE32('V3IM') };
280 
281     NW_RES_CTOR_INHERIT( ResParticleVector3ImmediateInitializer, ResParticleInitializer )
282 
283     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, ImmediateValue )
284 };
285 
286 //! @details :private
287 struct ResParticleVector3Random1InitializerData : public ResParticleInitializerData
288 {
289     nw::ut::ResVec3 m_BaseValue;
290     nw::ut::ResF32 m_Random;
291 };
292 
293 
294 //--------------------------------------------------------------------------
295 //! @brief  Vector3をひとつの乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
296 //---------------------------------------------------------------------------
297 class ResParticleVector3Random1Initializer : public ResParticleInitializer
298 {
299 public:
300     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3Random1Initializer) };
301     enum { SIGNATURE = NW_RES_SIGNATURE32('V3R1') };
302 
303     NW_RES_CTOR_INHERIT( ResParticleVector3Random1Initializer, ResParticleInitializer )
304 
305     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, BaseValue )
306     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
307 };
308 
309 //! @details :private
310 struct ResParticleVector3Random3InitializerData : public ResParticleInitializerData
311 {
312     nw::ut::ResVec3 m_BaseValue;
313     nw::ut::ResVec3 m_Random;
314 };
315 
316 
317 //--------------------------------------------------------------------------
318 //! @brief  Vector3を3個の乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
319 //---------------------------------------------------------------------------
320 class ResParticleVector3Random3Initializer : public ResParticleInitializer
321 {
322 public:
323     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3Random3Initializer) };
324     enum { SIGNATURE = NW_RES_SIGNATURE32('V3R3') };
325 
326     NW_RES_CTOR_INHERIT( ResParticleVector3Random3Initializer, ResParticleInitializer )
327 
328     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, BaseValue )
329     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Random )
330 };
331 
332 //! @details :private
333 struct ResParticleVector3MultRandomInitializerData : public ResParticleInitializerData
334 {
335     nw::ut::ResF32 m_Random;
336 };
337 
338 
339 //--------------------------------------------------------------------------
340 //! @brief  Vector3に乱数を乗算するパーティクルイニシャライザを表すバイナリリソースクラスです。
341 //---------------------------------------------------------------------------
342 class ResParticleVector3MultRandomInitializer : public ResParticleInitializer
343 {
344 public:
345     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3MultRandomInitializer) };
346     enum { SIGNATURE = NW_RES_SIGNATURE32('V3MR') };
347 
348     NW_RES_CTOR_INHERIT( ResParticleVector3MultRandomInitializer, ResParticleInitializer )
349 
350     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
351 };
352 
353 } // namespace res
354 } // namespace gfx
355 } // namespace nw
356 
357 #endif // NW_GFX_RESPARTICLEINITIALIZER_H_
358