mirror of
https://github.com/zeldaret/ss
synced 2026-06-21 00:11:13 -04:00
26af4db82d
* update from dtk-template and start work towards using clangd * include <a> -> "a" * Update build.yml * remove/add non-trivial class in union warning
134 lines
3.3 KiB
C++
134 lines
3.3 KiB
C++
#include "m/m3d/m_fanm.h"
|
|
|
|
namespace m3d {
|
|
|
|
fanm_c::fanm_c() {
|
|
mEndFrame = 0.0f;
|
|
mCurrentFrame = 0.0f;
|
|
mPlayState = 0.0f;
|
|
}
|
|
fanm_c::~fanm_c() {}
|
|
|
|
void fanm_c::play() {
|
|
f32 frame = mpAnmObj->GetFrame();
|
|
f32 rate = mpAnmObj->GetUpdateRate();
|
|
bool rateWasNegative = rate < 0.0f;
|
|
if (rateWasNegative) {
|
|
rate *= -1.0f;
|
|
}
|
|
mCurrentFrame = frame;
|
|
|
|
f32 newFrame;
|
|
if (rateWasNegative || (mPlayState & 2)) {
|
|
if (frame >= rate + mStartFrame) {
|
|
newFrame = frame - rate;
|
|
} else if ((mPlayState & 1) == 0) {
|
|
newFrame = frame + ((mEndFrame - rate) - mStartFrame);
|
|
} else {
|
|
newFrame = mStartFrame;
|
|
}
|
|
} else {
|
|
newFrame = frame + rate;
|
|
if ((mPlayState & 1) == 0) {
|
|
if (newFrame >= mEndFrame) {
|
|
newFrame = newFrame - mEndFrame;
|
|
}
|
|
} else {
|
|
f32 t = mEndFrame - 1.0f;
|
|
if (newFrame >= t) {
|
|
newFrame = t;
|
|
}
|
|
}
|
|
}
|
|
|
|
mpAnmObj->SetFrame(newFrame);
|
|
}
|
|
|
|
void fanm_c::set(f32 startFrame, playMode_e mode, f32 updateRate, f32 currentFrame) {
|
|
if (currentFrame < 0.0f) {
|
|
currentFrame = startFrame;
|
|
if (mode == PLAY_MODE_1) {
|
|
currentFrame = 0.0f;
|
|
} else {
|
|
currentFrame -= 1.0f;
|
|
}
|
|
}
|
|
|
|
mEndFrame = startFrame;
|
|
mStartFrame = 0.0f;
|
|
mpAnmObj->SetFrame(currentFrame);
|
|
mpAnmObj->SetUpdateRate(updateRate);
|
|
mPlayState = (u8)mode;
|
|
mCurrentFrame = currentFrame;
|
|
}
|
|
|
|
void fanm_c::set2(f32 startFrame, playMode_e mode, f32 endFrame, f32 rate, f32 currentFrame) {
|
|
if (currentFrame < 0.0f) {
|
|
currentFrame = rate < 0.0f ? endFrame - 1.0f : startFrame;
|
|
}
|
|
|
|
mStartFrame = startFrame;
|
|
mEndFrame = endFrame;
|
|
mpAnmObj->SetFrame(currentFrame);
|
|
mpAnmObj->SetUpdateRate(rate);
|
|
mPlayState = (u8)mode;
|
|
mCurrentFrame = currentFrame;
|
|
}
|
|
|
|
// assumed name
|
|
void fanm_c::setFrameOnly(f32 frame) {
|
|
banm_c::setFrameOnly(frame);
|
|
mCurrentFrame = frame;
|
|
}
|
|
|
|
bool fanm_c::isStop() const {
|
|
f32 frame = mpAnmObj->GetFrame();
|
|
f32 rate = mpAnmObj->GetUpdateRate();
|
|
if (rate < 0.0f || mPlayState == PLAY_MODE_3) {
|
|
return frame <= mStartFrame;
|
|
} else if (mPlayState == PLAY_MODE_1) {
|
|
return frame >= mEndFrame - 1.0f;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool fanm_c::checkFrame(f32 frame) const {
|
|
f32 stored = mpAnmObj->GetFrame();
|
|
if (mCurrentFrame == stored) {
|
|
return stored == frame;
|
|
}
|
|
|
|
f32 rate = mpAnmObj->GetUpdateRate();
|
|
if (rate < 0.0f || (mPlayState & 2)) {
|
|
if (mCurrentFrame > stored) {
|
|
if (mCurrentFrame > frame && stored <= frame) {
|
|
return true;
|
|
}
|
|
} else if (frame < mCurrentFrame || frame >= stored) {
|
|
return true;
|
|
}
|
|
} else {
|
|
if (mCurrentFrame < stored) {
|
|
if (mCurrentFrame < frame && stored >= frame) {
|
|
return true;
|
|
}
|
|
} else if (frame > mCurrentFrame || frame <= stored) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool fanm_c::unk_802EAE70() const {
|
|
f32 frame = mpAnmObj->GetFrame();
|
|
f32 rate = mpAnmObj->GetUpdateRate();
|
|
if (rate < 0.0f || (mPlayState & 2)) {
|
|
return mCurrentFrame < frame;
|
|
} else {
|
|
return mCurrentFrame > frame;
|
|
}
|
|
}
|
|
|
|
} // namespace m3d
|