#include <fstream>
class LOTPlayerPrivate {
-
-private:
- void setPos(float pos);
- bool update();
-
public:
LOTPlayerPrivate();
+ void update(float pos);
bool setFilePath(std::string path);
void setSize(const VSize &sz);
VSize size() const;
std::unique_ptr<LOTCompItem> mCompItem;
VSize mSize;
std::atomic<bool> mRenderInProgress;
-
-private:
- float mPos = 0.0;
- bool mChanged = true;
+ float mPos = 0.0;
};
void LOTPlayerPrivate::setSize(const VSize &sz)
{
- if (mSize != sz) {
- mChanged = true;
- mSize = sz;
- }
+ mSize = sz;
+ if (mCompItem) mCompItem->resize(sz);
}
VSize LOTPlayerPrivate::size() const
const std::vector<LOTNode *> &LOTPlayerPrivate::renderList(float pos)
{
- this->setPos(pos);
-
- if (!mCompItem || !this->update()) {
+ if (!mCompItem) {
static std::vector<LOTNode *> empty;
return empty;
}
+ update(pos);
+
return mCompItem->renderList();
}
return float(mModel->frameDuration()) / float(mModel->frameRate());
}
-void LOTPlayerPrivate::setPos(float pos)
-{
- if (pos > 1.0) pos = 1.0;
- if (pos < 0) pos = 0;
-
- if (!vCompare(pos, mPos)) mChanged = true;
-
- mPos = pos;
-}
-
float LOTPlayerPrivate::pos()
{
return mPos;
}
-bool LOTPlayerPrivate::update()
+void LOTPlayerPrivate::update(float pos)
{
- //Nothing updated, skip it.
- if (!mChanged) return true;
-
- mCompItem->resize(mSize);
+ if (pos > 1.0) pos = 1.0;
+ if (pos < 0) pos = 0;
+ mPos = pos;
int frameNumber;
if (mModel->isStatic()) frameNumber = 0;
- else frameNumber = mModel->startFrame() + this->pos() * mModel->frameDuration();
+ else frameNumber = mModel->startFrame() + pos * mModel->frameDuration();
- if (!mCompItem->update(frameNumber)) return false;
-
- mChanged = false;
-
- return true;
+ mCompItem->update(frameNumber);
}
bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer)
if (renderInProgress)
vCritical << "Already Rendering Scheduled for this Player";
- bool result = false;
-
- this->setPos(pos);
+ mRenderInProgress.store(true);
- if (this->update()) {
+ update(pos);
+ bool result = mCompItem->render(buffer);
- mRenderInProgress.store(true);
-
- if (mCompItem->render(buffer)) {
- result = true;
- }
-
- mRenderInProgress.store(false);
- }
+ mRenderInProgress.store(false);
return result;
}
if (loader.load(path)) {
mModel = loader.model();
mCompItem = std::make_unique<LOTCompItem>(mModel.get());
+ if (!mSize.isEmpty()) setSize(mSize);
return true;
}
return false;