17 #include "layercamera.h"
21 #include "pencildef.h"
25 setName(
tr(
"Camera Layer"));
28 mFieldW = settings.value(
"FieldW").toInt();
29 mFieldH = settings.value(
"FieldH").toInt();
30 if (mFieldW < 2 || mFieldH < 2)
35 viewRect =
QRect(
QPoint(-mFieldW / 2, -mFieldH / 2),
QSize(mFieldW, mFieldH));
38 LayerCamera::~LayerCamera()
42 Camera* LayerCamera::getCameraAtFrame(
int frameNumber)
44 return static_cast<Camera*
>(getKeyFrameAt(frameNumber));
47 Camera* LayerCamera::getLastCameraAtFrame(
int frameNumber,
int increment)
49 return static_cast<Camera*
>(getLastKeyFrameAtPosition(frameNumber + increment));
52 QTransform LayerCamera::getViewAtFrame(
int frameNumber)
const
54 if (keyFrameCount() == 0)
59 Camera* camera1 =
static_cast<Camera*
>(getLastKeyFrameAtPosition(frameNumber));
61 int nextFrame = getNextKeyFramePosition(frameNumber);
62 Camera* camera2 =
static_cast<Camera*
>(getLastKeyFrameAtPosition(nextFrame));
64 if (camera1 ==
nullptr && camera2 ==
nullptr)
68 else if (camera1 ==
nullptr && camera2 !=
nullptr)
72 else if (camera2 ==
nullptr && camera1 !=
nullptr)
77 if (camera1 == camera2)
82 double frame1 = camera1->pos();
83 double frame2 = camera2->pos();
86 qreal c2 = (frameNumber - frame1) / (frame2 - frame1);
89 auto interpolation = [=](
double f1,
double f2) ->
double
91 return f1 * c1 + f2 * c2;
95 interpolation(camera1->view.
m12(), camera2->view.
m12()),
96 interpolation(camera1->view.
m21(), camera2->view.
m21()),
97 interpolation(camera1->view.
m22(), camera2->view.
m22()),
98 interpolation(camera1->view.
dx(), camera2->view.
dx()),
99 interpolation(camera1->view.
dy(), camera2->view.
dy()));
103 void LayerCamera::linearInterpolateTransform(
Camera* cam)
105 if (keyFrameCount() == 0)
108 int frameNumber = cam->pos();
109 Camera* camera1 =
static_cast<Camera*
>(getLastKeyFrameAtPosition(frameNumber - 1));
111 int nextFrame = getNextKeyFramePosition(frameNumber);
112 Camera* camera2 =
static_cast<Camera*
>(getLastKeyFrameAtPosition(nextFrame));
114 if (camera1 ==
nullptr && camera2 ==
nullptr)
118 else if (camera1 ==
nullptr && camera2 !=
nullptr)
120 return cam->assign(*camera2);
122 else if (camera2 ==
nullptr && camera1 !=
nullptr)
124 return cam->assign(*camera1);
127 if (camera1 == camera2)
129 return cam->assign(*camera1);
132 double frame1 = camera1->pos();
133 double frame2 = camera2->pos();
136 double c2 = (frameNumber - frame1) / (frame2 - frame1);
138 auto lerp = [](
double f1,
double f2,
double ratio) ->
double
140 return f1 * (1.0 - ratio) + f2 * ratio;
143 double dx = lerp(camera1->translation().
x(), camera2->translation().
x(), c2);
144 double dy = lerp(camera1->translation().
y(), camera2->translation().
y(), c2);
145 double r = lerp(camera1->rotation(), camera2->rotation(), c2);
146 double s = lerp(camera1->scaling(), camera2->scaling(), c2);
148 cam->translate(dx, dy);
153 QRect LayerCamera::getViewRect()
158 QSize LayerCamera::getViewSize()
const
160 return viewRect.
size();
163 void LayerCamera::setViewRect(
QRect newViewRect)
165 viewRect = newViewRect;
166 emit resolutionChanged();
169 void LayerCamera::loadImageAtFrame(
int frameNumber, qreal dx, qreal dy, qreal rotate, qreal scale)
171 if (keyExists(frameNumber))
173 removeKeyFrame(frameNumber);
176 camera->setPos(frameNumber);
189 linearInterpolateTransform(c);
199 foreachKeyFrame([&](
KeyFrame* pKeyFrame)
215 void LayerCamera::loadDomElement(
const QDomElement& element,
QString dataDirPath, ProgressCallback progressStep)
217 Q_UNUSED(dataDirPath);
218 Q_UNUSED(progressStep);
220 this->loadBaseDomElement(element);
224 viewRect =
QRect(-width / 2, -height / 2, width, height);
227 while (!imageTag.
isNull())
230 if (!imageElement.
isNull())
232 if (imageElement.
tagName() ==
"camera")
241 loadImageAtFrame(frame, dx, dy, rotate, scale);
QDomNode appendChild(const QDomNode &newChild)
QString attribute(const QString &name, const QString &defValue) const const
double toDouble(bool *ok) const const
QString tr(const char *sourceText, const char *disambiguation, int n)
QDomNode nextSibling() const const
QDomElement toElement() const const
void setAttribute(const QString &name, const QString &value)
int toInt(bool *ok, int base) const const
bool isNull() const const
QDomNode firstChild() const const
QString tagName() const const
QDomElement createElement(const QString &tagName)