Signed-off-by: myperworld <myperworld@126.com>
This commit is contained in:
1 parent
0986832fd1
commit
aacd052c06
3403 files changed
+597376
-12
No files matched your search
@@ -0,0 +1,105 @@
|
||||
#include "fx_engine.h"
|
||||
#include "video.h"
|
||||
|
||||
namespace fl {
|
||||
|
||||
FxEngine::FxEngine(uint16_t numLeds, bool interpolate)
|
||||
: mTimeFunction(0), mCompositor(numLeds), mCurrId(0),
|
||||
mInterpolate(interpolate) {}
|
||||
|
||||
FxEngine::~FxEngine() {}
|
||||
|
||||
int FxEngine::addFx(FxPtr effect) {
|
||||
float fps = 0;
|
||||
if (mInterpolate && effect->hasFixedFrameRate(&fps)) {
|
||||
// Wrap the effect in a VideoFxWrapper so that we can get
|
||||
// interpolation.
|
||||
VideoFxWrapperPtr vid_fx = fl::make_shared<VideoFxWrapper>(effect);
|
||||
vid_fx->setFade(0, 0); // No fade for interpolated effects
|
||||
effect = vid_fx;
|
||||
}
|
||||
bool auto_set = mEffects.empty();
|
||||
bool ok = mEffects.insert(mCounter, effect).first;
|
||||
if (!ok) {
|
||||
return -1;
|
||||
}
|
||||
if (auto_set) {
|
||||
mCurrId = mCounter;
|
||||
mCompositor.startTransition(0, 0, effect);
|
||||
}
|
||||
return mCounter++;
|
||||
}
|
||||
|
||||
bool FxEngine::nextFx(uint16_t duration) {
|
||||
bool ok = mEffects.next(mCurrId, &mCurrId, true);
|
||||
if (!ok) {
|
||||
return false;
|
||||
}
|
||||
setNextFx(mCurrId, duration);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FxEngine::setNextFx(int index, uint16_t duration) {
|
||||
if (!mEffects.has(index)) {
|
||||
return false;
|
||||
}
|
||||
mCurrId = index;
|
||||
mDuration = duration;
|
||||
mDurationSet = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
FxPtr FxEngine::removeFx(int index) {
|
||||
if (!mEffects.has(index)) {
|
||||
return FxPtr();
|
||||
}
|
||||
|
||||
FxPtr removedFx;
|
||||
bool ok = mEffects.get(index, &removedFx);
|
||||
if (!ok) {
|
||||
return FxPtr();
|
||||
}
|
||||
|
||||
if (mCurrId == index) {
|
||||
// If we're removing the current effect, switch to the next one
|
||||
mEffects.next(mCurrId, &mCurrId, true);
|
||||
mDurationSet = true;
|
||||
mDuration = 0; // Instant transition
|
||||
}
|
||||
|
||||
return removedFx;
|
||||
}
|
||||
|
||||
FxPtr FxEngine::getFx(int id) {
|
||||
if (mEffects.has(id)) {
|
||||
FxPtr fx;
|
||||
mEffects.get(id, &fx);
|
||||
return fx;
|
||||
}
|
||||
return FxPtr();
|
||||
}
|
||||
|
||||
bool FxEngine::draw(fl::u32 now, CRGB *finalBuffer) {
|
||||
mTimeFunction.update(now);
|
||||
fl::u32 warpedTime = mTimeFunction.time();
|
||||
|
||||
if (mEffects.empty()) {
|
||||
return false;
|
||||
}
|
||||
if (mDurationSet) {
|
||||
FxPtr fx;
|
||||
bool ok = mEffects.get(mCurrId, &fx);
|
||||
if (!ok) {
|
||||
// something went wrong.
|
||||
return false;
|
||||
}
|
||||
mCompositor.startTransition(now, mDuration, fx);
|
||||
mDurationSet = false;
|
||||
}
|
||||
if (!mEffects.empty()) {
|
||||
mCompositor.draw(now, warpedTime, finalBuffer);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace fl
|
||||
Reference in new issue
Block a user