Files
ss/src/m/m3d/m_fanm.cpp
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

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