/**********************************************************************
Animation - Basic animation
Copyright (C) 2008 by Tim Vandermeersch
Copyright (C) 2009 by Geoffrey Hutchison
This file is part of the Avogadro molecular editor project.
For more information, see
Some code is based on Open Babel
For more information, see
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
***********************************************************************/
#include "animation.h"
#include
#include
#include
using namespace OpenBabel;
using Eigen::Vector3d;
namespace Avogadro {
Animation::Animation(QObject *parent) : QObject(parent),
m_molecule(0), m_timeLine(new QTimeLine)
{
}
Animation::~Animation()
{
if (m_timeLine) {
delete m_timeLine;
m_timeLine = 0;
}
}
void Animation::setMolecule(Molecule *molecule)
{
m_molecule = molecule;
m_originalConformers.clear();
if (molecule == NULL)
return; // we can't save the current conformers
for (unsigned int i = 0; i < molecule->numConformers(); ++i) {
m_originalConformers.push_back(molecule->conformer(i));
}
}
void Animation::setDuration(int i)
{
int interval = 1000 / i;
m_timeLine->setUpdateInterval(interval);
int duration = interval * m_frames.size();
m_timeLine->setDuration(duration);
}
void Animation::setLoopCount(int loops)
{
m_timeLine->setLoopCount(loops);
}
void Animation::setFrame(int i)
{
m_molecule->setConformer(i - 1);
m_molecule->update();
}
void Animation::setFrames(std::vector< std::vector< Eigen::Vector3d> *> frames)
{
if (frames.size() == 0)
return; // nothing to do
m_frames = frames;
m_timeLine->setFrameRange(1, frames.size());
}
void Animation::stop()
{
m_timeLine->stop();
m_timeLine->setCurrentTime(0);
disconnect(m_timeLine, SIGNAL(frameChanged(int)),
this, SLOT(setFrame(int)));
// restore original conformers
m_molecule->setAllConformers(m_originalConformers);
setFrame(1);
}
void Animation::start()
{
// set molecule conformers
m_molecule->setAllConformers(m_frames);
setFrame(1);
connect(m_timeLine, SIGNAL(frameChanged(int)),
this, SLOT(setFrame(int)));
m_timeLine->setCurrentTime(0);
m_timeLine->start();
}
} // end namespace Avogadro
#include "animation.moc"