mirror of
https://github.com/rwengine/openrw.git
synced 2024-11-22 18:32:44 +01:00
e58be26be8
Previously the worker thread was constructed before the queue was, leading to unfortunate race conditions. This fixes that, along with unrelated minor cleanup.
94 lines
2.2 KiB
C++
94 lines
2.2 KiB
C++
#include "ModelViewer.hpp"
|
|
#include <QDebug>
|
|
#include <widgets/ModelFramesWidget.hpp>
|
|
#include <data/Skeleton.hpp>
|
|
#include <engine/Animator.hpp>
|
|
#include <objects/GameObject.hpp>
|
|
#include "ViewerWidget.hpp"
|
|
#include <fstream>
|
|
|
|
ModelViewer::ModelViewer(ViewerWidget* viewer, QWidget* parent, Qt::WindowFlags f)
|
|
: ViewerInterface(parent, f), viewing(nullptr), skeleton(nullptr)
|
|
{
|
|
mainSplit = new QSplitter;
|
|
mainLayout = new QVBoxLayout;
|
|
|
|
viewerWidget = viewer;
|
|
viewerWidget->setMinimumSize(250,250);
|
|
|
|
animationWidget = new AnimationListWidget;
|
|
connect(animationWidget, SIGNAL(selectedAnimationChanged(Animation*)),
|
|
SLOT(playAnimation(Animation*)));
|
|
|
|
frames = new ModelFramesWidget;
|
|
frames->setMaximumWidth(300);
|
|
|
|
mainSplit->addWidget(frames);
|
|
mainSplit->addWidget(animationWidget);
|
|
mainLayout->addWidget(mainSplit);
|
|
|
|
this->setLayout(mainLayout);
|
|
|
|
connect(frames, SIGNAL(selectedFrameChanged(ModelFrame*)),
|
|
viewerWidget, SLOT(selectFrame(ModelFrame*)));
|
|
setViewerWidget(viewerWidget);
|
|
}
|
|
|
|
void ModelViewer::setViewerWidget(ViewerWidget* widget)
|
|
{
|
|
viewerWidget = widget;
|
|
mainSplit->addWidget(viewerWidget);
|
|
showModel(viewing);
|
|
}
|
|
|
|
void ModelViewer::showModel(Model* model)
|
|
{
|
|
viewing = model;
|
|
if( skeleton )
|
|
{
|
|
delete skeleton;
|
|
}
|
|
skeleton = new Skeleton();
|
|
viewerWidget->showModel(model);
|
|
frames->setModel(model, nullptr);
|
|
}
|
|
|
|
void ModelViewer::showObject(uint16_t object)
|
|
{
|
|
viewerWidget->showObject(object);
|
|
viewing = viewerWidget->currentModel();
|
|
skeleton = viewerWidget->currentObject()->skeleton;
|
|
frames->setModel(viewing, skeleton);
|
|
}
|
|
|
|
void ModelViewer::loadAnimations(const QString& file)
|
|
{
|
|
std::ifstream dfile(file.toStdString().c_str(), std::ios_base::binary);
|
|
AnimationList anims;
|
|
|
|
if(dfile.is_open())
|
|
{
|
|
dfile.seekg(0, std::ios_base::end);
|
|
size_t length = dfile.tellg();
|
|
dfile.seekg(0);
|
|
char *file = new char[length];
|
|
dfile.read(file, length);
|
|
|
|
LoaderIFP loader;
|
|
if( loader.loadFromMemory(file) ) {
|
|
for(auto& f : loader.animations) {
|
|
anims.push_back(f);
|
|
}
|
|
}
|
|
|
|
delete[] file;
|
|
}
|
|
|
|
animationWidget->setAnimations(anims);
|
|
}
|
|
|
|
void ModelViewer::playAnimation(Animation* anim)
|
|
{
|
|
viewerWidget->currentObject()->animator->playAnimation(0, anim, 1.f, true);
|
|
}
|