NW4F Eft
Loading...
Searching...
No Matches
eft_Emitter.h
Go to the documentation of this file.
1#ifndef EFT_EMITTER_H_
2#define EFT_EMITTER_H_
3
4#include <nw/eft/eft_typeDef.h>
5#include <nw/eft/eft_Data.h>
6#include <nw/eft/eft_Random.h>
7#include <nw/eft/eft_AnimKeyFrame.h>
8#include <nw/eft/eft_Primitive.h>
9#include <nw/eft/eft_Shader.h>
10#include <nw/eft/eft_Particle.h>
11
12namespace nw { namespace eft {
13
14class EmitterCalc;
17class EmitterSet;
21
23{
71
72 mutable u32 entryNum;
75
83
84 void Init(const SimpleEmitterData* resource);
85 void UpdateResInfo();
86
87 void TransformWorldVec(nw::math::VEC3* pDst, nw::math::VEC3* pSrc, PtclInstance* pPtcl);
88 void TransformWorldVecNormal(nw::math::VEC3* pDst, nw::math::VEC3* pSrc, PtclInstance* pPtcl);
89 void TransformLocalVec(nw::math::VEC3* pDst, nw::math::VEC3* pSrc, PtclInstance* pPtcl);
90 void TransformLocalVecNormal(nw::math::VEC3* pDst, nw::math::VEC3* pSrc, PtclInstance* pPtcl);
91
93 {
94 return res->type;
95 }
96
98 {
99 return res->billboardType;
100 }
101
103 {
104 return res;
105 }
106
108 {
109 return res->drawPath;
110 }
111
112 const char* GetEmitterName() const
113 {
114 return res->name;
115 }
116
118 {
119 return res->blendType;
120 }
121
123 {
124 return emitterSet;
125 }
126
128 {
129 if (res->type != EFT_EMITTER_TYPE_COMPLEX)
130 return NULL;
131
132 return reinterpret_cast<const ComplexEmitterData*>(res);
133 }
134
135 const ChildData* GetChildData() const
136 {
137 if (res->type == EFT_EMITTER_TYPE_SIMPLE)
138 return NULL;
139
140 const ComplexEmitterData* cres = reinterpret_cast<const ComplexEmitterData*>(res);
141
142 if (cres->childFlg & EFT_CHILD_FLAG_ENABLE)
143 return reinterpret_cast<const ChildData*>(cres + 1);
144 else
145 return NULL;
146 }
147
149 {
150 if (res->type == EFT_EMITTER_TYPE_SIMPLE)
151 return NULL;
152
153 const ComplexEmitterData* cres = reinterpret_cast<const ComplexEmitterData*>(res);
154
157 {
158 return reinterpret_cast<const StripeData*>((u32)cres + cres->stripeDataOffset);
159 }
160
161 return NULL;
162 }
163
165 {
167 return false;
168
169 const ComplexEmitterData* cres = reinterpret_cast<const ComplexEmitterData*>(res);
170
171 if (cres->childFlg & EFT_CHILD_FLAG_ENABLE)
172 return true;
173 else
174 return false;
175 }
176
178 {
179 return (res->userData & bit) ? true : false;
180 }
181
183 {
184 return static_cast<u8>(res->userData);
185 }
186
188 {
189 return static_cast<u8>(res->userData >> 8);
190 }
191
193 {
194 return static_cast<u8>(res->userData2);
195 }
196
198 {
199 return static_cast<u8>(res->userData2 >> 8);
200 }
201
203 {
204 return static_cast<u8>(res->userData2 >> 16);
205 }
206
208 {
209 return static_cast<u8>(res->userData2 >> 24);
210 }
211
213 {
214 return res->userDataF[idx];
215 }
216};
217static_assert(sizeof(EmitterInstance) == 0x220, "nw::eft::EmitterInstance size mismatch");
218
219class System;
220
222{
223public:
224 explicit EmitterCalc(System* sys)
225 {
226 mSys = sys;
227 }
228
229 virtual ~EmitterCalc() // deleted
230 {
231 mSys = NULL;
232 }
233
234 virtual void CalcEmitter(EmitterInstance* e) = 0;
235
236 static void Initialize(Heap *heap)
237 {
239 }
240
241 static void Finalize(Heap *heap)
242 {
244 mSys = NULL;
245 }
246
247 static void EmitParticle(EmitterInstance* __restrict e)
248 {
250 }
251
252 static void RemoveParticle(EmitterInstance* e, PtclInstance* ptcl, CpuCore core);
253
254 virtual PtclType GetPtclType() const = 0;
255
256 virtual u32 CalcParticle(EmitterInstance* e, CpuCore core, bool skipBehavior, bool skipMakeAttribute)
257 {
258 return 0;
259 }
260
261 virtual u32 CalcChildParticle(EmitterInstance* e, CpuCore core, bool skipBehavior, bool skipMakeAttribute)
262 {
263 return 0;
264 }
265
266 static u32 CalcSimpleParticleBehavior (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, CpuCore core);
267 static u32 CalcComplexParticleBehavior(EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, CpuCore core);
268 static u32 CalcChildParticleBehavior (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, CpuCore core);
269 static void MakeParticleAttributeBuffer(PtclAttributeBuffer* __restrict attrBuffer, PtclInstance* __restrict ptcl, u32 shaderAttrFlag, f32 cameraOffset);
270
271protected:
272 static System* mSys;
273
274 static PtclInstance* _emitPoint (EmitterInstance* __restrict e);
275 static PtclInstance* _emitCircle (EmitterInstance* __restrict e);
276 static PtclInstance* _emitCircleSameDivide (EmitterInstance* __restrict e);
277 static PtclInstance* _emitFillCircle (EmitterInstance* __restrict e);
278 static PtclInstance* _emitSphere (EmitterInstance* __restrict e);
279 static PtclInstance* _emitSphereSameDivide (EmitterInstance* __restrict e);
281 static PtclInstance* _emitFillSphere (EmitterInstance* __restrict e);
282 static PtclInstance* _emitCylinder (EmitterInstance* __restrict e);
283 static PtclInstance* _emitFillCylinder (EmitterInstance* __restrict e);
284 static PtclInstance* _emitBox (EmitterInstance* __restrict e);
285 static PtclInstance* _emitFillBox (EmitterInstance* __restrict e);
286 static PtclInstance* _emitLine (EmitterInstance* __restrict e);
287 static PtclInstance* _emitLineSameDivide (EmitterInstance* __restrict e);
288 static PtclInstance* _emitRectangle (EmitterInstance* __restrict e);
289
290 typedef PtclInstance* (*EmitFunction)(EmitterInstance* __restrict e);
291 static EmitFunction mEmitFunctions[];
292
293 static const void* _ptclField_Random (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
294 static const void* _ptclField_Magnet (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
295 static const void* _ptclField_Spin (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
296 static const void* _ptclField_Collision (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
297 static const void* _ptclField_Convergence(EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
298 static const void* _ptclField_PosAdd (EmitterInstance* __restrict e, PtclInstance* __restrict ptcl, const void* fieldData);
299 static void _calcField(const ComplexEmitterData* __restrict res, EmitterInstance* __restrict e, PtclInstance* __restrict ptcl);
300
302 static void InitializeFluctuation_(Heap* heap);
303 static void FinalzieFluctuation_(Heap* heap);
304 static void CalcFluctuation(EmitterInstance* __restrict e, PtclInstance* __restrict ptcl);
305
306 static void EmitCommon(EmitterInstance* __restrict e, PtclInstance* __restrict ptcl);
307
308 static inline void AddParticle(EmitterInstance* emitter, PtclInstance* ptcl);
309};
310static_assert(sizeof(EmitterCalc) == 4, "nw::eft::EmitterCalc size mismatch");
311
312inline void EmitterCalc::_calcField(const ComplexEmitterData* __restrict res, EmitterInstance* __restrict e, PtclInstance* __restrict ptcl)
313{
314 const void* __restrict fres = reinterpret_cast<const void*>((u32)res + res->fieldDataOffset);
315
316 if ( res->fieldFlg & EFT_FIELD_MASK_RANDOM ) fres = _ptclField_Random (e, ptcl, fres);
317 if ( res->fieldFlg & EFT_FIELD_MASK_MAGNET ) fres = _ptclField_Magnet (e, ptcl, fres);
318 if ( res->fieldFlg & EFT_FIELD_MASK_SPIN ) fres = _ptclField_Spin (e, ptcl, fres);
319 if ( res->fieldFlg & EFT_FIELD_MASK_COLLISION ) fres = _ptclField_Collision (e, ptcl, fres);
320 if ( res->fieldFlg & EFT_FIELD_MASK_CONVERGENCE ) fres = _ptclField_Convergence(e, ptcl, fres);
321 if ( res->fieldFlg & EFT_FIELD_MASK_POSADD ) fres = _ptclField_PosAdd (e, ptcl, fres);
322}
323
325{
326 if (emitter->ptclHead == NULL)
327 {
328 emitter->ptclHead = ptcl;
329 ptcl->prev = NULL;
330 ptcl->next = NULL;
331 }
332 else
333 {
334 emitter->ptclHead->prev = ptcl;
335 ptcl->next = emitter->ptclHead;
336 emitter->ptclHead = ptcl;
337 ptcl->prev = NULL;
338 }
339
340 if (emitter->ptclTail == NULL)
341 emitter->ptclTail = ptcl;
342
343 emitter->ptclNum++;
344}
345
346} } // namespace nw::eft
347
348#endif // EFT_EMITTER_H_
Definition eft_Emitter.h:222
static const void * _ptclField_Convergence(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:193
static PtclInstance * _emitLineSameDivide(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:3165
static void EmitParticle(EmitterInstance *__restrict e)
Definition eft_Emitter.h:247
static const void * _ptclField_PosAdd(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:204
static PtclInstance * _emitSphereSameDivide(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2804
static void RemoveParticle(EmitterInstance *e, PtclInstance *ptcl, CpuCore core)
Definition eft_Emitter.cpp:255
static void AddParticle(EmitterInstance *emitter, PtclInstance *ptcl)
Definition eft_Emitter.h:324
static const void * _ptclField_Magnet(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:23
static void InitializeFluctuation_(Heap *heap)
Definition eft_EmitterFluctuation.cpp:9
static System * mSys
Definition eft_Emitter.h:272
static void Initialize(Heap *heap)
Definition eft_Emitter.h:236
static void EmitCommon(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl)
Definition eft_Emitter.cpp:290
static const void * _ptclField_Random(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:8
virtual u32 CalcChildParticle(EmitterInstance *e, CpuCore core, bool skipBehavior, bool skipMakeAttribute)
Definition eft_Emitter.h:261
static PtclInstance * _emitFillBox(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:3064
static PtclInstance * _emitLine(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:3143
static void FinalzieFluctuation_(Heap *heap)
Definition eft_EmitterFluctuation.cpp:22
virtual PtclType GetPtclType() const =0
EmitterCalc(System *sys)
Definition eft_Emitter.h:224
static const void * _ptclField_Spin(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:34
static u32 CalcChildParticleBehavior(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, CpuCore core)
Definition eft_ParticleBehavior.cpp:527
virtual void CalcEmitter(EmitterInstance *e)=0
static const void * _ptclField_Collision(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, const void *fieldData)
Definition eft_EmitterField.cpp:106
static PtclInstance * _emitBox(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2985
static void Finalize(Heap *heap)
Definition eft_Emitter.h:241
static void MakeParticleAttributeBuffer(PtclAttributeBuffer *__restrict attrBuffer, PtclInstance *__restrict ptcl, u32 shaderAttrFlag, f32 cameraOffset)
Definition eft_ParticleBehavior.cpp:650
static PtclInstance * _emitCircle(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2658
static f32 * sFluctuationTbl
Definition eft_Emitter.h:301
static void CalcFluctuation(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl)
Definition eft_EmitterFluctuation.cpp:28
static PtclInstance * _emitCylinder(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2923
static PtclInstance * _emitCircleSameDivide(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2684
virtual ~EmitterCalc()
Definition eft_Emitter.h:229
static PtclInstance * _emitFillCylinder(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2952
static PtclInstance * _emitSphere(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2763
static u32 CalcSimpleParticleBehavior(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, CpuCore core)
Definition eft_ParticleBehavior.cpp:192
static PtclInstance * _emitFillSphere(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2878
static void _calcField(const ComplexEmitterData *__restrict res, EmitterInstance *__restrict e, PtclInstance *__restrict ptcl)
Definition eft_Emitter.h:312
static EmitFunction mEmitFunctions[]
Definition eft_Emitter.h:291
static PtclInstance * _emitFillCircle(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2728
virtual u32 CalcParticle(EmitterInstance *e, CpuCore core, bool skipBehavior, bool skipMakeAttribute)
Definition eft_Emitter.h:256
static u32 CalcComplexParticleBehavior(EmitterInstance *__restrict e, PtclInstance *__restrict ptcl, CpuCore core)
Definition eft_ParticleBehavior.cpp:358
static PtclInstance * _emitRectangle(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:3204
static PtclInstance * _emitPoint(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2639
static PtclInstance * _emitSphereSameDivide64(EmitterInstance *__restrict e)
Definition eft_EmitterVolume.cpp:2841
Definition eft_EmitterSet.h:15
Definition eft_EmitterSet.h:122
Definition eft_Heap.h:9
Definition eft_Shader.h:410
Definition eft_Primitive.h:10
Definition eft_Random.h:133
Definition eft_System.h:24
Definition eft_CafeWrapper.cpp:117
PtclType
Definition eft_Data.h:43
PtclFollowType
Definition eft_Data.h:53
UserDataFlag
Definition eft_Data.h:601
UserDataParamIdx
Definition eft_Data.h:621
CpuCore
Definition eft_Data.h:24
BlendType
Definition eft_Data.h:321
EmitterType
Definition eft_Data.h:34
@ EFT_EMITTER_TYPE_SIMPLE
Definition eft_Data.h:35
@ EFT_SHADER_TYPE_MAX
Definition eft_Data.h:314
BillboardType
Definition eft_Data.h:365
@ EFT_BILLBOARD_TYPE_COMPLEX_STRIPE
Definition eft_Data.h:372
@ EFT_BILLBOARD_TYPE_STRIPE
Definition eft_Data.h:371
@ EFT_ANIM_MAX
Definition eft_AnimKeyFrame.h:44
@ EFT_CHILD_FLAG_ENABLE
Definition eft_Data.h:468
@ EFT_FIELD_MASK_POSADD
Definition eft_Data.h:515
@ EFT_FIELD_MASK_COLLISION
Definition eft_Data.h:513
@ EFT_FIELD_MASK_MAGNET
Definition eft_Data.h:511
@ EFT_FIELD_MASK_CONVERGENCE
Definition eft_Data.h:514
@ EFT_FIELD_MASK_RANDOM
Definition eft_Data.h:510
@ EFT_FIELD_MASK_SPIN
Definition eft_Data.h:512
Definition eft_Data.h:1024
EmitterType type
Definition eft_Data.h:787
char * name
Definition eft_Data.h:795
Definition eft_Data.h:1006
Definition eft_UniformBlock.h:22
Definition eft_Emitter.h:23
u32 childEntryNum
Definition eft_Emitter.h:73
const SimpleEmitterData * GetSimpleEmitterData() const
Definition eft_Emitter.h:102
u32 emitterSetCreateID
Definition eft_Emitter.h:34
EmitterDynamicUniformBlock * childEmitterDynamicUniformBlock
Definition eft_Emitter.h:82
bool stopDraw
Definition eft_Emitter.h:67
EmitterInstance * next
Definition eft_Emitter.h:49
u8 GetUserDataU8Param1() const
Definition eft_Emitter.h:187
KeyFrameAnimArray * emitterAnimArray
Definition eft_Emitter.h:60
u32 behaviorFlag
Definition eft_Emitter.h:68
bool isCalculated
Definition eft_Emitter.h:66
bool isEmitted
Definition eft_Emitter.h:65
nw::math::MTX34 emitterRT
Definition eft_Emitter.h:35
u32 GetDrawPathFlag() const
Definition eft_Emitter.h:107
BillboardType GetBillboardType() const
Definition eft_Emitter.h:97
ParticleShader * shader[EFT_SHADER_TYPE_MAX]
Definition eft_Emitter.h:56
f32 emitSaving
Definition eft_Emitter.h:28
const ComplexEmitterData * GetComplexEmitterData() const
Definition eft_Emitter.h:127
EmitterStaticUniformBlock * childEmitterStaticUniformBlock
Definition eft_Emitter.h:80
u32 shaderArrtFlag
Definition eft_Emitter.h:69
EmitterCalc * calc
Definition eft_Emitter.h:50
ParticleShader * childShader[EFT_SHADER_TYPE_MAX]
Definition eft_Emitter.h:57
PtclInstance * childHead
Definition eft_Emitter.h:53
nw::math::VEC3 rotatRnd
Definition eft_Emitter.h:45
u32 stripeVertexNum
Definition eft_Emitter.h:74
PtclInstance * childTail
Definition eft_Emitter.h:55
BlendType GetBlendType() const
Definition eft_Emitter.h:117
f32 emitDistVessel
Definition eft_Emitter.h:43
f32 preCnt
Definition eft_Emitter.h:25
EmitterType GetEmitterType() const
Definition eft_Emitter.h:92
void UpdateResInfo()
Definition eft_Emitter.cpp:66
s32 groupID
Definition eft_Emitter.h:31
f32 GetUserDataF32Param(nw::eft::UserDataParamIdx idx) const
Definition eft_Emitter.h:212
PtclFollowType followType
Definition eft_Emitter.h:47
nw::math::VEC3 scaleRnd
Definition eft_Emitter.h:44
void TransformWorldVec(nw::math::VEC3 *pDst, nw::math::VEC3 *pSrc, PtclInstance *pPtcl)
s32 childPtclNum
Definition eft_Emitter.h:30
f32 preEmitCnt
Definition eft_Emitter.h:27
EmitterInstance * prev
Definition eft_Emitter.h:48
nw::math::VEC3 transRnd
Definition eft_Emitter.h:46
u8 GetUserDataU8Param2() const
Definition eft_Emitter.h:192
f32 frameRate
Definition eft_Emitter.h:40
void TransformWorldVecNormal(nw::math::VEC3 *pDst, nw::math::VEC3 *pSrc, PtclInstance *pPtcl)
nw::math::MTX34 animEmitterRT
Definition eft_Emitter.h:62
const char * GetEmitterName() const
Definition eft_Emitter.h:112
f32 cnt
Definition eft_Emitter.h:24
PtclAttributeBuffer * ptclAttributeBuffer
Definition eft_Emitter.h:76
const ChildData * GetChildData() const
Definition eft_Emitter.h:135
f32 fadeAlpha
Definition eft_Emitter.h:39
PtclRandom rnd
Definition eft_Emitter.h:37
u8 GetUserDataU8Param4() const
Definition eft_Emitter.h:202
const SimpleEmitterData * res
Definition eft_Emitter.h:51
EmitterStaticUniformBlock * emitterStaticUniformBlock
Definition eft_Emitter.h:79
u32 entryNum
Definition eft_Emitter.h:72
void TransformLocalVec(nw::math::VEC3 *pDst, nw::math::VEC3 *pSrc, PtclInstance *pPtcl)
void Init(const SimpleEmitterData *resource)
Definition eft_Emitter.cpp:10
bool IsEnableUserDataFlag(nw::eft::UserDataFlag bit) const
Definition eft_Emitter.h:177
Primitive * childPrimitive
Definition eft_Emitter.h:59
s32 emissionInterval
Definition eft_Emitter.h:38
EmitterController * controller
Definition eft_Emitter.h:33
void TransformLocalVecNormal(nw::math::VEC3 *pDst, nw::math::VEC3 *pSrc, PtclInstance *pPtcl)
bool emitDistPrevPosSet
Definition eft_Emitter.h:42
u8 GetUserDataU8Param0() const
Definition eft_Emitter.h:182
bool IsHasChildParticle() const
Definition eft_Emitter.h:164
f32 emitAnimValue[EFT_ANIM_MAX]
Definition eft_Emitter.h:61
u32 childShaderArrtFlag
Definition eft_Emitter.h:70
nw::math::MTX34 emitterSRT
Definition eft_Emitter.h:36
EmitterDynamicUniformBlock * emitterDynamicUniformBlock
Definition eft_Emitter.h:81
const StripeData * GetStripeData() const
Definition eft_Emitter.h:148
EmitterSet * emitterSet
Definition eft_Emitter.h:32
StripeVertexBuffer * stripeBuffer
Definition eft_Emitter.h:78
s32 ptclNum
Definition eft_Emitter.h:29
f32 emitCnt
Definition eft_Emitter.h:26
Primitive * primitive
Definition eft_Emitter.h:58
u8 GetUserDataU8Param3() const
Definition eft_Emitter.h:197
PtclInstance * ptclHead
Definition eft_Emitter.h:52
f32 emitVessel
Definition eft_Emitter.h:64
PtclAttributeBuffer * childPtclAttributeBuffer
Definition eft_Emitter.h:77
u8 GetUserDataU8Param5() const
Definition eft_Emitter.h:207
PtclInstance * ptclTail
Definition eft_Emitter.h:54
nw::math::MTX34 animEmitterSRT
Definition eft_Emitter.h:63
nw::math::VEC3 emitDistPrevPos
Definition eft_Emitter.h:41
const EmitterSet * GetEmitterSet() const
Definition eft_Emitter.h:122
Definition eft_UniformBlock.h:29
Definition eft_AnimKeyFrame.h:69
Definition eft_Data.h:656
Definition eft_Particle.h:69
PtclInstance * prev
Definition eft_Particle.h:103
PtclInstance * next
Definition eft_Particle.h:104
Definition eft_Data.h:834
BillboardType billboardType
Definition eft_Data.h:923
BlendType blendType
Definition eft_Data.h:877
VolumeType volumeType
Definition eft_Data.h:879
Definition eft_Data.h:1162
Definition eft_UniformBlock.h:38