summaryrefslogtreecommitdiff
path: root/src/JSystem/JParticle/JPAExtraShape.cpp
blob: 2c269a3106362cf080a8d9294c4edd892c26cc9a (plain)
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//
// Generated By: dol2asm
// Translation Unit: JPAExtraShape
//

#include "JSystem/JParticle/JPAExtraShape.h"
#include "JSystem/JMath/JMATrigonometric.h"
#include "JSystem/JParticle/JPAParticle.h"
#include "JSystem/JParticle/JPAEmitter.h"
#include "dolphin/os.h"

/* 8027A918-8027A990 275258 0078+00 0/0 1/1 0/0 .text
 * JPACalcScaleX__FP18JPAEmitterWorkDataP15JPABaseParticle      */
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;
    }
}

/* 8027A990-8027AA08 2752D0 0078+00 0/0 1/1 0/0 .text
 * JPACalcScaleY__FP18JPAEmitterWorkDataP15JPABaseParticle      */
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;
    }
}

/* 8027AA08-8027AA14 275348 000C+00 0/0 1/1 0/0 .text
 * JPACalcScaleCopy__FP18JPAEmitterWorkDataP15JPABaseParticle   */
void JPACalcScaleCopy(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    ptcl->mParticleScaleY = ptcl->mParticleScaleX;
}

/* 8027AA14-8027AA20 275354 000C+00 0/0 1/1 0/0 .text
 * JPACalcScaleAnmNormal__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcScaleAnmNormal(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    work->mScaleAnm = ptcl->mTime;
}

/* 8027AA20-8027AA84 275360 0064+00 0/0 1/1 0/0 .text
 * JPACalcScaleAnmRepeatX__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcScaleAnmRepeatX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    work->mScaleAnm = (ptcl->mAge % esp->getScaleAnmCycleX()) / (f32)esp->getScaleAnmCycleX();
}

/* 8027AA84-8027AAE8 2753C4 0064+00 0/0 1/1 0/0 .text
 * JPACalcScaleAnmRepeatY__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcScaleAnmRepeatY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    work->mScaleAnm = (ptcl->mAge % esp->getScaleAnmCycleY()) / (f32)esp->getScaleAnmCycleY();
}

/* 8027AAE8-8027AB7C 275428 0094+00 0/0 1/1 0/0 .text
 * JPACalcScaleAnmReverseX__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcScaleAnmReverseX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    s32 cycle = ptcl->mAge / esp->getScaleAnmCycleX();
    f32 base = (ptcl->mAge % esp->getScaleAnmCycleX()) / (f32)esp->getScaleAnmCycleX();
    work->mScaleAnm = base + ((cycle & 1) * (1.0f - base * 2.0f));
}

/* 8027AB7C-8027AC10 2754BC 0094+00 0/0 1/1 0/0 .text
 * JPACalcScaleAnmReverseY__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcScaleAnmReverseY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    s32 cycle = ptcl->mAge / esp->getScaleAnmCycleY();
    f32 base = (ptcl->mAge % esp->getScaleAnmCycleY()) / (f32)esp->getScaleAnmCycleY();
    work->mScaleAnm = base + ((cycle & 1) * (1.0f - base * 2.0f));
}

/* 8027AC10-8027AC98 275550 0088+00 0/0 1/1 0/0 .text
 * JPACalcAlphaAnm__FP18JPAEmitterWorkDataP15JPABaseParticle    */
void JPACalcAlphaAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    f32 alpha;
    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);
}

/* 8027AC98-8027AD88 2755D8 00F0+00 0/0 1/1 0/0 .text
 * JPACalcAlphaFlickAnm__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
    JPAExtraShape* esp = work->mpRes->getEsp();
    f32 alpha;
    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();
    }
    s32 theta = ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq());
    f32 wave = JMASSin(theta);
    alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f;
    OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm);
}

/* 8027AD88-8027ADBC 2756C8 0034+00 0/0 1/1 0/0 .text            __ct__13JPAExtraShapeFPCUc */
JPAExtraShape::JPAExtraShape(u8 const* data) {
    mpData = (const JPAExtraShapeData*)data;
    init();
}

/* 8027ADBC-8027AEBC 2756FC 0100+00 1/1 0/0 0/0 .text            init__13JPAExtraShapeFv */
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;
    }
}