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 
NW_DEPRECATED_FUNCTION(s32 GetTargetStreamsCount ()const)62     NW_DEPRECATED_FUNCTION(s32 GetTargetStreamsCount() const)
63     {
64         if (this->GetTargetStream() < 0)
65         {
66             return 0;
67         }
68 
69         return 1;
70     }
71 
NW_DEPRECATED_FUNCTION(ParticleUsage * GetTargetStreams ())72     NW_DEPRECATED_FUNCTION(ParticleUsage* GetTargetStreams())
73     {
74         return (ParticleUsage*)&ref().m_TargetStream;
75     }
76 
NW_DEPRECATED_FUNCTION(const ParticleUsage * GetTargetStreams ()const)77     NW_DEPRECATED_FUNCTION(const ParticleUsage* GetTargetStreams() const)
78     {
79         return (const ParticleUsage*)&ref().m_TargetStream;
80     }
81 };
82 
83 //! @details :private
84 struct ResParticleDirectionalVelocityInitializerData : public ResParticleInitializerData
85 {
86     nw::ut::ResF32 m_Power;
87     nw::ut::ResVec3 m_Direction;
88 };
89 
90 
91 //--------------------------------------------------------------------------
92 //! @brief  パーティクル放出方向と速度を表すバイナリリソースクラスです。
93 //---------------------------------------------------------------------------
94 class ResParticleDirectionalVelocityInitializer : public ResParticleInitializer
95 {
96 public:
97     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleDirectionalVelocityInitializer) };
98     enum { SIGNATURE = NW_RES_SIGNATURE32('DIRV') };
99 
100     NW_RES_CTOR_INHERIT( ResParticleDirectionalVelocityInitializer, ResParticleInitializer )
101 
102     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power )             // GetPower(), SetPower()
103     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Direction ) // GetDirection()
104 };
105 
106 
107 //! @details :private
108 struct ResParticleRandomDirectionalVelocityInitializerData : public ResParticleInitializerData
109 {
110     nw::ut::ResF32 m_Power;
111     nw::ut::ResVec3 m_Direction;
112     nw::ut::ResF32 m_Angle;
113 };
114 
115 
116 
117 //--------------------------------------------------------------------------
118 //! @brief  ランダムなパーティクル放出方向と速度を表すバイナリリソースクラスです。
119 //---------------------------------------------------------------------------
120 class ResParticleRandomDirectionalVelocityInitializer : public ResParticleInitializer
121 {
122 public:
123     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleRandomDirectionalVelocityInitializer) };
124     enum { SIGNATURE = NW_RES_SIGNATURE32('RDRV') };
125 
126     NW_RES_CTOR_INHERIT( ResParticleRandomDirectionalVelocityInitializer, ResParticleInitializer )
127 
128     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power )               // GetPower(), SetPower()
129     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Direction )  // GetDirection()
130     NW_RES_FIELD_PRIMITIVE_DECL( f32, Angle )               // GetAngle(), SetAngle()
131 };
132 
133 
134 //! @details :private
135 struct ResParticleOriginVelocityInitializerData : public ResParticleInitializerData
136 {
137     nw::ut::ResF32 m_Power;
138 };
139 
140 
141 //--------------------------------------------------------------------------
142 //! @brief  パーティクルの原点から拡散する速度を表すバイナリリソースクラスです。
143 //---------------------------------------------------------------------------
144 class ResParticleOriginVelocityInitializer : public ResParticleInitializer
145 {
146 public:
147     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleOriginVelocityInitializer) };
148     enum { SIGNATURE = NW_RES_SIGNATURE32('ORIV') };
149 
150     NW_RES_CTOR_INHERIT( ResParticleOriginVelocityInitializer, ResParticleInitializer )
151 
152     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
153 };
154 
155 //! @details :private
156 struct ResParticleRandomVelocityInitializerData : public ResParticleInitializerData
157 {
158     nw::ut::ResF32 m_Power;
159 };
160 
161 
162 //--------------------------------------------------------------------------
163 //! @brief  パーティクルのランダムな速度を表すバイナリリソースクラスです。
164 //---------------------------------------------------------------------------
165 class ResParticleRandomVelocityInitializer : public ResParticleInitializer
166 {
167 public:
168     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleRandomVelocityInitializer) };
169     enum { SIGNATURE = NW_RES_SIGNATURE32('RNDV') };
170 
171     NW_RES_CTOR_INHERIT( ResParticleRandomVelocityInitializer, ResParticleInitializer )
172 
173     NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
174 };
175 
176 //! @details :private
177 struct ResParticleYAxisVelocityInitializerData : public ResParticleInitializerData
178 {
179     nw::ut::ResF32 m_Power;
180 };
181 
182 
183 //--------------------------------------------------------------------------
184 //! @brief  パーティクルのY軸から拡散する速度を表すバイナリリソースクラスです。
185 //---------------------------------------------------------------------------
186 class ResParticleYAxisVelocityInitializer : public ResParticleInitializer
187 {
188 public:
189     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleYAxisVelocityInitializer) };
190     enum { SIGNATURE = NW_RES_SIGNATURE32('YAXV') };
191 
192     NW_RES_CTOR_INHERIT( ResParticleYAxisVelocityInitializer, ResParticleInitializer )
193 
194         NW_RES_FIELD_PRIMITIVE_DECL( f32, Power ) // GetPower(), SetPower()
195 };
196 
197 //! @details :private
198 struct ResParticleFloatRandomInitializerData : public ResParticleInitializerData
199 {
200     nw::ut::ResF32 m_BaseValue;
201     nw::ut::ResF32 m_Random;
202 };
203 
204 
205 //--------------------------------------------------------------------------
206 //! @brief  f32を乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
207 //---------------------------------------------------------------------------
208 class ResParticleFloatRandomInitializer : public ResParticleInitializer
209 {
210 public:
211     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatRandomInitializer) };
212     enum { SIGNATURE = NW_RES_SIGNATURE32('FRND') };
213 
214     NW_RES_CTOR_INHERIT( ResParticleFloatRandomInitializer, ResParticleInitializer )
215 
216     NW_RES_FIELD_PRIMITIVE_DECL( f32, BaseValue )
217     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
218 };
219 
220 //! @details :private
221 struct ResParticleFloatRangeRandomInitializerData : public ResParticleInitializerData
222 {
223     nw::ut::ResF32 m_MaxValue;
224     nw::ut::ResF32 m_MinValue;
225 };
226 
227 
228 
229 //--------------------------------------------------------------------------
230 //! @brief  f32を範囲指定の乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
231 //---------------------------------------------------------------------------
232 class ResParticleFloatRangeRandomInitializer : public ResParticleInitializer
233 {
234 public:
235     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatRangeRandomInitializer) };
236     enum { SIGNATURE = NW_RES_SIGNATURE32('URRA') };
237 
238     NW_RES_CTOR_INHERIT( ResParticleFloatRangeRandomInitializer, ResParticleInitializer )
239 
240     NW_RES_FIELD_PRIMITIVE_DECL( f32, MaxValue )
241     NW_RES_FIELD_PRIMITIVE_DECL( f32, MinValue )
242 };
243 
244 //! @details :private
245 struct ResParticleFloatImmediateInitializerData : public ResParticleInitializerData
246 {
247     nw::ut::ResF32 m_ImmediateValue;
248 };
249 
250 //--------------------------------------------------------------------------
251 //! @brief  f32を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
252 //---------------------------------------------------------------------------
253 class ResParticleFloatImmediateInitializer : public ResParticleInitializer
254 {
255 public:
256     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleFloatImmediateInitializer) };
257     enum { SIGNATURE = NW_RES_SIGNATURE32('SFIM') };
258 
259     NW_RES_CTOR_INHERIT( ResParticleFloatImmediateInitializer, ResParticleInitializer )
260 
261     NW_RES_FIELD_PRIMITIVE_DECL( f32, ImmediateValue )
262 };
263 
264 //! @details :private
265 struct ResParticleVector2ImmediateInitializerData : public ResParticleInitializerData
266 {
267     nw::ut::ResVec2 m_ImmediateValue;
268 };
269 
270 
271 //--------------------------------------------------------------------------
272 //! @brief  Vector2を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
273 //---------------------------------------------------------------------------
274 class ResParticleVector2ImmediateInitializer : public ResParticleInitializer
275 {
276 public:
277     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector2ImmediateInitializer) };
278     enum { SIGNATURE = NW_RES_SIGNATURE32('V2IM') };
279 
280     NW_RES_CTOR_INHERIT( ResParticleVector2ImmediateInitializer, ResParticleInitializer )
281 
282     NW_RES_FIELD_VECTOR2_DECL( nw::math::VEC2, ImmediateValue )
283 };
284 
285 //! @details :private
286 struct ResParticleVector3ImmediateInitializerData : public ResParticleInitializerData
287 {
288     nw::ut::ResVec3 m_ImmediateValue;
289 };
290 
291 
292 //--------------------------------------------------------------------------
293 //! @brief  Vectro3を即値で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
294 //---------------------------------------------------------------------------
295 class ResParticleVector3ImmediateInitializer : public ResParticleInitializer
296 {
297 public:
298     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3ImmediateInitializer) };
299     enum { SIGNATURE = NW_RES_SIGNATURE32('V3IM') };
300 
301     NW_RES_CTOR_INHERIT( ResParticleVector3ImmediateInitializer, ResParticleInitializer )
302 
303     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, ImmediateValue )
304 };
305 
306 //! @details :private
307 struct ResParticleVector3Random1InitializerData : public ResParticleInitializerData
308 {
309     nw::ut::ResVec3 m_BaseValue;
310     nw::ut::ResF32 m_Random;
311 };
312 
313 
314 //--------------------------------------------------------------------------
315 //! @brief  Vector3をひとつの乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
316 //---------------------------------------------------------------------------
317 class ResParticleVector3Random1Initializer : public ResParticleInitializer
318 {
319 public:
320     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3Random1Initializer) };
321     enum { SIGNATURE = NW_RES_SIGNATURE32('V3R1') };
322 
323     NW_RES_CTOR_INHERIT( ResParticleVector3Random1Initializer, ResParticleInitializer )
324 
325     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, BaseValue )
326     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
327 };
328 
329 //! @details :private
330 struct ResParticleVector3Random3InitializerData : public ResParticleInitializerData
331 {
332     nw::ut::ResVec3 m_BaseValue;
333     nw::ut::ResVec3 m_Random;
334 };
335 
336 
337 //--------------------------------------------------------------------------
338 //! @brief  Vector3を3個の乱数で初期化するパーティクルイニシャライザを表すバイナリリソースクラスです。
339 //---------------------------------------------------------------------------
340 class ResParticleVector3Random3Initializer : public ResParticleInitializer
341 {
342 public:
343     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3Random3Initializer) };
344     enum { SIGNATURE = NW_RES_SIGNATURE32('V3R3') };
345 
346     NW_RES_CTOR_INHERIT( ResParticleVector3Random3Initializer, ResParticleInitializer )
347 
348     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, BaseValue )
349     NW_RES_FIELD_VECTOR3_DECL( nw::math::VEC3, Random )
350 };
351 
352 //! @details :private
353 struct ResParticleVector3MultRandomInitializerData : public ResParticleInitializerData
354 {
355     nw::ut::ResF32 m_Random;
356 };
357 
358 
359 //--------------------------------------------------------------------------
360 //! @brief  Vector3に乱数を乗算するパーティクルイニシャライザを表すバイナリリソースクラスです。
361 //---------------------------------------------------------------------------
362 class ResParticleVector3MultRandomInitializer : public ResParticleInitializer
363 {
364 public:
365     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResParticleVector3MultRandomInitializer) };
366     enum { SIGNATURE = NW_RES_SIGNATURE32('V3MR') };
367 
368     NW_RES_CTOR_INHERIT( ResParticleVector3MultRandomInitializer, ResParticleInitializer )
369 
370     NW_RES_FIELD_PRIMITIVE_DECL( f32, Random )
371 };
372 
373 } // namespace res
374 } // namespace gfx
375 } // namespace nw
376 
377 #endif // NW_GFX_RESPARTICLEINITIALIZER_H_
378