Pencil2D  ff90c0872e88be3bf81c548cd60f01983012ec49
Pencil2D is an animation software for both bitmap and vector graphics. It is free, multi-platform, and open source.
 All Classes Functions
layercamera.cpp
1 /*
2 
3 Pencil - Traditional Animation Software
4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5 Copyright (C) 2012-2017 Matthew Chiawen Chang
6 
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; version 2 of the License.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 */
17 
18 #include <QLineEdit>
19 #include <QSpinBox>
20 #include <QLabel>
21 #include <QPushButton>
22 #include <QHBoxLayout>
23 #include <QtDebug>
24 #include "camera.h"
25 #include "layercamera.h"
26 
27 
28 CameraPropertiesDialog::CameraPropertiesDialog(QString name, int width, int height) : QDialog()
29 {
30  QLabel* nameLabel = new QLabel(tr("Camera name:"));
31  nameBox = new QLineEdit();
32  nameBox->setText(name);
33  QHBoxLayout* nameLayout = new QHBoxLayout();
34  nameLayout->addWidget(nameLabel);
35  nameLayout->addWidget(nameBox);
36 
37  QLabel* sizeLabel = new QLabel(tr("Camera size:"));
38  widthBox = new QSpinBox();
39  heightBox = new QSpinBox();
40  widthBox->setValue(width);
41  heightBox->setValue(height);
42  widthBox->setMaximum(10000);
43  heightBox->setMaximum(10000);
44  widthBox->setMinimum(1);
45  heightBox->setMinimum(1);
46  QHBoxLayout* sizeLayout = new QHBoxLayout();
47  sizeLayout->addWidget(sizeLabel);
48  sizeLayout->addWidget(widthBox);
49  sizeLayout->addWidget(heightBox);
50 
51  QPushButton* okButton = new QPushButton(tr("Ok"));
52  QPushButton* cancelButton = new QPushButton(tr("Cancel"));
53  QHBoxLayout* buttonLayout = new QHBoxLayout();
54  buttonLayout->addWidget(okButton);
55  buttonLayout->addWidget(cancelButton);
56 
57  QGridLayout* layout = new QGridLayout();
58  layout->addLayout(nameLayout, 0, 0);
59  layout->addLayout(sizeLayout, 1, 0);
60  layout->addLayout(buttonLayout, 2, 0);
61  setLayout(layout);
62  connect(okButton, SIGNAL(pressed()), this, SLOT(accept()));
63  connect(cancelButton, SIGNAL(pressed()), this, SLOT(reject()));
64 }
65 
66 CameraPropertiesDialog::~CameraPropertiesDialog()
67 {
68 }
69 
70 QString CameraPropertiesDialog::getName()
71 {
72  return nameBox->text();
73 }
74 
75 void CameraPropertiesDialog::setName(QString name)
76 {
77  nameBox->setText(name);
78 }
79 
80 int CameraPropertiesDialog::getWidth()
81 {
82  return widthBox->value();
83 }
84 
85 void CameraPropertiesDialog::setWidth(int width)
86 {
87  widthBox->setValue(width);
88 }
89 
90 int CameraPropertiesDialog::getHeight()
91 {
92  return heightBox->value();
93 }
94 
95 void CameraPropertiesDialog::setHeight(int height)
96 {
97  heightBox->setValue(height);
98 }
99 
100 // ------
101 
102 LayerCamera::LayerCamera( Object* object ) : Layer( object, Layer::CAMERA )
103 {
104  mName = QString(tr("Camera Layer"));
105  viewRect = QRect( QPoint(-320,-240), QSize(640,480) );
106  dialog = NULL;
107 }
108 
109 LayerCamera::~LayerCamera()
110 {
111 }
112 
113 Camera* LayerCamera::getCameraAtFrame(int frameNumber)
114 {
115  return static_cast< Camera* >( getKeyFrameAt( frameNumber ) );
116 }
117 
118 Camera* LayerCamera::getLastCameraAtFrame(int frameNumber, int increment)
119 {
120  return static_cast< Camera* >( getLastKeyFrameAtPosition( frameNumber + increment ) );
121 }
122 
123 QTransform LayerCamera::getViewAtFrame(int frameNumber)
124 {
125  if ( keyFrameCount() == 0 )
126  {
127  return QTransform();
128  }
129 
130  Camera* camera1 = static_cast< Camera* >( getLastKeyFrameAtPosition( frameNumber ) );
131 
132  int nextFrame = getNextKeyFramePosition( frameNumber );
133  Camera* camera2 = static_cast< Camera* >( getLastKeyFrameAtPosition( nextFrame ) );
134 
135  if (camera1 == NULL && camera2 == NULL)
136  {
137  return QTransform();
138  }
139  else if (camera1 == NULL && camera2 != NULL)
140  {
141  return camera2->view;
142  }
143  else if (camera2 == NULL && camera1 != NULL)
144  {
145  return camera1->view;
146  }
147 
148  if ( camera1 == camera2 )
149  {
150  return camera1->view;
151  }
152 
153  int frame1 = camera1->pos();
154  int frame2 = camera2->pos();
155 
156  // linear interpolation
157  qreal c2 = ( frameNumber - frame1 + 0.0 ) / ( frame2 - frame1 );
158  qreal c1 = 1.0 - c2;
159  //qDebug() << ">> -- " << c1 << c2;
160 
161  auto interpolation = [=]( double f1, double f2 ) -> double
162  {
163  return f1 * c1 + f2 * c2;
164  };
165 
166  return QTransform( interpolation( camera1->view.m11(), camera2->view.m11() ),
167  interpolation( camera1->view.m12(), camera2->view.m12() ),
168  interpolation( camera1->view.m21(), camera2->view.m21() ),
169  interpolation( camera1->view.m22(), camera2->view.m22() ),
170  interpolation( camera1->view.dx(), camera2->view.dx() ),
171  interpolation( camera1->view.dy(), camera2->view.dy() ) );
172 
173 }
174 
175 QRect LayerCamera::getViewRect()
176 {
177  return viewRect;
178 }
179 
180 
181 QSize LayerCamera::getViewSize()
182 {
183  return viewRect.size();
184 }
185 
186 void LayerCamera::loadImageAtFrame( int frameNumber, QTransform view )
187 {
188  if ( keyExists( frameNumber ) )
189  {
190  removeKeyFrame( frameNumber );
191  }
192  //Camera* camera = new Camera( view );
193  //camera->setPos( frameNumber );
194  //addKeyFrame( frameNumber, camera );
195 }
196 
197 
198 Status LayerCamera::saveKeyFrame( KeyFrame* pKeyFrame, QString path )
199 {
200  Q_UNUSED( path );
201  Q_UNUSED( pKeyFrame );
202  return Status::OK;
203 }
204 
205 
206 void LayerCamera::editProperties()
207 {
208  if ( dialog == NULL )
209  {
210  dialog = new CameraPropertiesDialog( mName, viewRect.width(), viewRect.height() );
211  }
212  dialog->setName(mName);
213  dialog->setWidth(viewRect.width());
214  dialog->setHeight(viewRect.height());
215  int result = dialog->exec();
216  if (result == QDialog::Accepted)
217  {
218  mName = dialog->getName();
219  viewRect = QRect(-dialog->getWidth()/2, -dialog->getHeight()/2, dialog->getWidth(), dialog->getHeight());
220 
221  setUpdated();
222  }
223 }
224 
225 QDomElement LayerCamera::createDomElement( QDomDocument& doc )
226 {
227  QDomElement layerTag = doc.createElement("layer");
228 
229  layerTag.setAttribute("name", mName);
230  layerTag.setAttribute("visibility", mVisible);
231  layerTag.setAttribute("type", type());
232  layerTag.setAttribute("width", viewRect.width());
233  layerTag.setAttribute("height", viewRect.height());
234 
235  foreachKeyFrame( [&]( KeyFrame* pKeyFrame )
236  {
237  Camera* camera = static_cast< Camera* >( pKeyFrame );
238  QDomElement keyTag = doc.createElement("camera");
239  keyTag.setAttribute( "frame", camera->pos() );
240 
241  keyTag.setAttribute( "m11", camera->view.m11() );
242  keyTag.setAttribute( "m12", camera->view.m12() );
243  keyTag.setAttribute( "m21", camera->view.m21() );
244  keyTag.setAttribute( "m22", camera->view.m22() );
245  keyTag.setAttribute( "dx", camera->view.dx() );
246  keyTag.setAttribute( "dy", camera->view.dy() );
247  layerTag.appendChild( keyTag );
248  } );
249 
250  return layerTag;
251 }
252 
253 void LayerCamera::loadDomElement(QDomElement element, QString dataDirPath)
254 {
255  Q_UNUSED(dataDirPath);
256 
257  mName = element.attribute("name");
258  mVisible = true;
259 
260  int width = element.attribute( "width" ).toInt();
261  int height = element.attribute( "height" ).toInt();
262  viewRect = QRect( -width / 2, -height / 2, width, height );
263 
264  QDomNode imageTag = element.firstChild();
265  while (!imageTag.isNull())
266  {
267  QDomElement imageElement = imageTag.toElement();
268  if (!imageElement.isNull())
269  {
270  if (imageElement.tagName() == "camera")
271  {
272  int frame = imageElement.attribute("frame").toInt();
273 
274  qreal m11 = imageElement.attribute("m11").toDouble();
275  qreal m12 = imageElement.attribute("m12").toDouble();
276  qreal m21 = imageElement.attribute("m21").toDouble();
277  qreal m22 = imageElement.attribute("m22").toDouble();
278  qreal dx = imageElement.attribute("dx").toDouble();
279  qreal dy = imageElement.attribute("dy").toDouble();
280 
281  loadImageAtFrame( frame, QTransform( m11, m12, m21, m22, dx, dy ) );
282  }
283  }
284  imageTag = imageTag.nextSibling();
285  }
286 }
Definition: camera.h:24
Definition: layer.h:32
Definition: object.h:71