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