mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-06 19:11:21 -04:00
4df8ccc871
* Reorganize files into libs/{dolphin,JSystem,PowerPC_EABI_Support,revolution,TRK_MINNOW_DOLPHIN}
* Update configure.py and project.py for new libs structure
* Refactor `#include <dolphin/x.h>` -> `<x.h>`
* Remove `__REVOLUTION_SDK__` forwards from dolphin
* Fix dolphin/ references in revolution
* Wrap `#include <dolphin.h>` in `!__REVOLUTION_SDK__`
* Always build TRK against dolphin headers
* Resolve revolution SDK header resolution issues
126 lines
5.1 KiB
C++
126 lines
5.1 KiB
C++
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/JParticle/JPAExtraShape.h"
|
|
#include "JSystem/JMath/JMATrigonometric.h"
|
|
#include "JSystem/JParticle/JPAParticle.h"
|
|
#include "JSystem/JParticle/JPAEmitter.h"
|
|
#include <os.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 = JMASSin(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;
|
|
}
|
|
}
|