1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "JSystem/JParticle/JPAExtraShape.h"
#include "JSystem/JParticle/JPAParticle.h"
#include "JSystem/JParticle/JPAEmitter.h"
#include "nw4r/math/math_triangular.h"
void JPACalcScaleX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
if (work->mScaleAnm < esp->getScaleInTiming()) {
ptcl->mParticleScaleX =
ptcl->mScaleOut * (esp->getScaleIncRateX() * work->mScaleAnm + esp->getScaleInValueX());
} else if (work->mScaleAnm > esp->getScaleOutTiming()) {
ptcl->mParticleScaleX =
ptcl->mScaleOut *
(esp->getScaleDecRateX() * (work->mScaleAnm - esp->getScaleOutTiming()) + 1.0f);
} else {
ptcl->mParticleScaleX = ptcl->mScaleOut;
}
}
void JPACalcScaleY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
if (work->mScaleAnm < esp->getScaleInTiming()) {
ptcl->mParticleScaleY =
ptcl->mScaleOut * (esp->getScaleIncRateY() * work->mScaleAnm + esp->getScaleInValueY());
} else if (work->mScaleAnm > esp->getScaleOutTiming()) {
ptcl->mParticleScaleY =
ptcl->mScaleOut *
(esp->getScaleDecRateY() * (work->mScaleAnm - esp->getScaleOutTiming()) + 1.0f);
} else {
ptcl->mParticleScaleY = ptcl->mScaleOut;
}
}
void JPACalcScaleCopy(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
ptcl->mParticleScaleY = ptcl->mParticleScaleX;
}
void JPACalcScaleAnmNormal(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
work->mScaleAnm = ptcl->mTime;
}
void JPACalcScaleAnmRepeatX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
work->mScaleAnm = (ptcl->mAge % esp->getScaleAnmCycleX()) / (f32)esp->getScaleAnmCycleX();
}
void JPACalcScaleAnmRepeatY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
work->mScaleAnm = (ptcl->mAge % esp->getScaleAnmCycleY()) / (f32)esp->getScaleAnmCycleY();
}
void JPACalcScaleAnmReverseX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
f32 cycle = ptcl->mAge / esp->getScaleAnmCycleX() & 1;
f32 base = (ptcl->mAge % esp->getScaleAnmCycleX()) / (f32)esp->getScaleAnmCycleX();
work->mScaleAnm = base + cycle * (1.0f - base * 2.0f);
}
void JPACalcScaleAnmReverseY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
f32 cycle = ptcl->mAge / esp->getScaleAnmCycleY() & 1;
f32 base = (ptcl->mAge % esp->getScaleAnmCycleY()) / (f32)esp->getScaleAnmCycleY();
work->mScaleAnm = base + cycle * (1.0f - base * 2.0f);
}
void JPACalcAlphaAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
f32 alpha = 0.0f;
if (ptcl->mTime < esp->getAlphaInTiming()) {
alpha = 255.0f * (esp->getAlphaInValue() + esp->getAlphaIncRate() * ptcl->mTime);
} else if (ptcl->mTime > esp->getAlphaOutTiming()) {
alpha = 255.0f * ((ptcl->mTime - esp->getAlphaOutTiming()) * esp->getAlphaDecRate() +
esp->getAlphaBaseValue());
} else {
alpha = 255.0f * esp->getAlphaBaseValue();
}
OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm);
}
void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
JPAExtraShape* esp = work->mpRes->getEsp();
f32 alpha = 0.0f;
if (ptcl->mTime < esp->getAlphaInTiming()) {
alpha = (esp->getAlphaInValue() + esp->getAlphaIncRate() * ptcl->mTime);
} else if (ptcl->mTime > esp->getAlphaOutTiming()) {
alpha = ((ptcl->mTime - esp->getAlphaOutTiming()) * esp->getAlphaDecRate() +
esp->getAlphaBaseValue());
} else {
alpha = esp->getAlphaBaseValue();
}
f32 wave = nw4r::math::SinIdx(ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq()));
alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f;
OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm);
}
JPAExtraShape::JPAExtraShape(u8 const* data) {
mpData = (const JPAExtraShapeData*)data;
init();
}
void JPAExtraShape::init() {
mAlphaIncRate = (getAlphaInTiming() != 0.0f) ?
(getAlphaBaseValue() - getAlphaInValue()) / getAlphaInTiming() :
1.0f;
mAlphaDecRate = (getAlphaOutTiming() != 1.0f) ?
(getAlphaOutValue() - getAlphaBaseValue()) / (1.0f - getAlphaOutTiming()) :
1.0f;
if (getScaleInTiming() != 0.0f) {
mScaleIncRateX = (1.0f - getScaleInValueX()) / getScaleInTiming();
mScaleIncRateY = (1.0f - getScaleInValueY()) / getScaleInTiming();
} else {
mScaleIncRateX = mScaleIncRateY = 1.0f;
}
if (getScaleOutTiming() != 1.0f) {
mScaleDecRateX = (getScaleOutValueX() - 1.0f) / (1.0f - getScaleOutTiming());
mScaleDecRateY = (getScaleOutValueY() - 1.0f) / (1.0f - getScaleOutTiming());
} else {
mScaleDecRateX = mScaleDecRateY = 1.0f;
}
}
|