mirror of
https://github.com/zeldaret/ss
synced 2026-06-02 02:00:06 -04:00
170 lines
4.8 KiB
C++
170 lines
4.8 KiB
C++
#include "toBeSorted/d_particle.h"
|
|
|
|
#include "JSystem/JParticle/JPAEmitter.h"
|
|
#include "JSystem/JParticle/JPAEmitterManager.h"
|
|
#include "JSystem/JParticle/JPAResourceManager.h"
|
|
#include "common.h"
|
|
#include "egg/core/eggHeap.h"
|
|
#include "egg/egg_types.h"
|
|
#include "egg/gfx/eggCpuTexture.h"
|
|
#include "egg/gfx/eggTexture.h"
|
|
#include "m/m_angle.h"
|
|
#include "m/m_heap.h"
|
|
#include "m/m_vec.h"
|
|
|
|
extern "C" const u16 lbl_8057AB72;
|
|
extern "C" const u16 lbl_8057AB74;
|
|
|
|
static u32 extractResMgrIdx(u16 particleResId) {
|
|
return (particleResId & lbl_8057AB72) != 0 ? 1 : 0;
|
|
}
|
|
|
|
static u16 extractResUserIdx(u16 particleResId) {
|
|
return (particleResId & ~(lbl_8057AB72 | lbl_8057AB74));
|
|
}
|
|
|
|
namespace dParticle {
|
|
|
|
JPAResourceManager *res_c::init(const void *jpc, const void *jpn, EGG::Heap *heap) {
|
|
mpHeap = mHeap::createFrmHeap(-1, heap, "dParticle::res_c", 0x20, mHeap::OPT_NONE);
|
|
if (mpHeap == nullptr) {
|
|
return nullptr;
|
|
}
|
|
mpResourceManager = new (mpHeap, 4) JPAResourceManager(jpc, mpHeap);
|
|
if (mpResourceManager != nullptr) {
|
|
mpJpnData = static_cast<const JPN *>(jpn);
|
|
}
|
|
mHeap::adjustFrmHeap(mpHeap);
|
|
return mpResourceManager;
|
|
}
|
|
|
|
void res_c::dispose() {
|
|
if (mpHeap != nullptr) {
|
|
if (mpResourceManager != nullptr) {
|
|
mpResourceManager = nullptr;
|
|
mpJpnData = nullptr;
|
|
}
|
|
mpHeap->destroy();
|
|
mpHeap = nullptr;
|
|
}
|
|
}
|
|
|
|
void tex_c::set(EGG::CpuTexture *tex) {
|
|
mImg.format = tex->getFormat();
|
|
mImg.alphaEnabled = true;
|
|
mImg.width = tex->getWidth();
|
|
mImg.height = tex->getHeight();
|
|
mImg.wrapS = tex->getWrapS();
|
|
mImg.wrapT = tex->getWrapT();
|
|
mImg.indexTexture = 0;
|
|
mImg.colorFormat = GX_TL_IA8;
|
|
mImg.numColors = 0;
|
|
mImg.paletteOffset = 0;
|
|
mImg.mipmapEnabled = 0;
|
|
mImg.doEdgeLOD = 0;
|
|
mImg.biasClamp = 0;
|
|
mImg.maxAnisotropy = 0;
|
|
mImg.minFilter = tex->getMinFilt();
|
|
mImg.magFilter = tex->getMagFilt();
|
|
mImg.minLOD = 0;
|
|
mImg.maxLOD = 0;
|
|
mImg.mipmapCount = 1;
|
|
mImg.LODBias = 0;
|
|
mImg.imageOffset = (u32)tex->getBuffer() - (u32)&mImg;
|
|
|
|
for (int i = 0; i < D_PARTICLE_NUM_RES; i++) {
|
|
JPAResourceManager *mgr = dParticle::mgr_c::GetInstance()->getResourceManager(i);
|
|
if (mgr != nullptr) {
|
|
mgr->swapTexture(&mImg, "dummy");
|
|
}
|
|
}
|
|
}
|
|
|
|
mgr_c *mgr_c::sInstance;
|
|
|
|
mgr_c::mgr_c(EGG::Heap *heap, u32 ptclMax, u32 emtrMax, u8 grpMax) : mpEmitterMgr(nullptr) {
|
|
sInstance = this;
|
|
mpEmitterMgr = new (heap, 4) JPAEmitterManager(ptclMax, emtrMax, heap, grpMax, D_PARTICLE_NUM_RES);
|
|
}
|
|
|
|
void mgr_c::createResource(EGG::Heap *heap, s32 mgrIndex, void *jpc, void *jpn) {
|
|
JPAResourceManager *mgr = mRes[mgrIndex].init(jpc, jpn, heap);
|
|
if (mgr != nullptr) {
|
|
mpEmitterMgr->entryResourceManager(mgr, mgrIndex);
|
|
}
|
|
}
|
|
|
|
void mgr_c::disposeResource(s32 mgrIndex) {
|
|
res_c &res = mRes[mgrIndex];
|
|
if (res.getResourceManager() != nullptr) {
|
|
mpEmitterMgr->clearResourceManager(mgrIndex);
|
|
}
|
|
res.dispose();
|
|
}
|
|
|
|
s32 mgr_c::getResUserWork(u16 particleResId) const {
|
|
u8 idx = extractResMgrIdx(particleResId);
|
|
JPAResourceManager *mgr = mpEmitterMgr->getResourceManager(idx);
|
|
if (mgr == nullptr) {
|
|
return -1;
|
|
}
|
|
return mgr->getResUserWork(extractResUserIdx(particleResId));
|
|
}
|
|
|
|
u16 mgr_c::getJpnData(u16 particleResId) const {
|
|
const JPN *jpn = mRes[extractResMgrIdx(particleResId)].getJpn();
|
|
u16 idx = extractResUserIdx(particleResId);
|
|
if (idx >= jpn->numJpn) {
|
|
return 0xFFFF;
|
|
} else {
|
|
return jpn->mData[idx];
|
|
}
|
|
}
|
|
|
|
void mgr_c::doCustomSkywardSwordThing(u8 groupId, f32 x, f32 y) {
|
|
mpEmitterMgr->fn_80320E20(groupId, x, y);
|
|
}
|
|
|
|
void mgr_c::calc(u8 groupId) {
|
|
mpEmitterMgr->calc(groupId);
|
|
}
|
|
|
|
void mgr_c::draw(const JPADrawInfo *drawInfo, u8 groupId) {
|
|
mpEmitterMgr->draw(drawInfo, groupId);
|
|
}
|
|
|
|
JPABaseEmitter *
|
|
mgr_c::createEmitter(u16 particleResId, u8 groupId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale) {
|
|
u32 resMgrId = extractResMgrIdx(particleResId);
|
|
u16 resId = extractResUserIdx(particleResId);
|
|
JPABaseEmitter *emitter = mpEmitterMgr->createSimpleEmitterID(pos, resId, groupId, resMgrId, nullptr, nullptr);
|
|
if (emitter == nullptr) {
|
|
return nullptr;
|
|
}
|
|
if (rot != nullptr) {
|
|
emitter->setGlobalRotation(*rot);
|
|
}
|
|
if (scale != nullptr) {
|
|
emitter->setGlobalScale(*scale);
|
|
}
|
|
return emitter;
|
|
}
|
|
|
|
void mgr_c::forceDeleteAllEmitter() {
|
|
mpEmitterMgr->forceDeleteAllEmitter();
|
|
}
|
|
|
|
void mgr_c::forceDeleteEmitter(JPABaseEmitter *emitter) {
|
|
mpEmitterMgr->forceDeleteEmitter(emitter);
|
|
}
|
|
|
|
JPAResourceManager *mgr_c::getResourceManager(s32 idx) {
|
|
return mRes[idx].getResourceManager();
|
|
}
|
|
|
|
mgr_c *mgr_c::create(EGG::Heap *heap, u32 ptclMax, u32 emtrMax, u8 grpMax) {
|
|
return new (heap, 4) mgr_c(heap, ptclMax, emtrMax, grpMax);
|
|
}
|
|
|
|
} // namespace dParticle
|