From 76eb43c02308ae803ba15fcec1ac873eaaacb86a Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Sat, 16 Apr 2016 14:06:02 +0100 Subject: [PATCH] Fix compilation and runtime issues with reviewer from recent changes --- rwviewer/ViewerWidget.cpp | 7 ++-- rwviewer/ViewerWidget.hpp | 12 ++++--- rwviewer/ViewerWindow.cpp | 25 +------------- rwviewer/ViewerWindow.hpp | 2 +- rwviewer/models/DFFFramesTreeModel.cpp | 2 +- rwviewer/models/DFFFramesTreeModel.hpp | 2 +- rwviewer/views/ModelViewer.cpp | 45 +++++++++++++++++++++++--- rwviewer/views/ModelViewer.hpp | 13 ++++++-- rwviewer/views/ObjectViewer.hpp | 1 - rwviewer/widgets/ModelFramesWidget.cpp | 2 +- rwviewer/widgets/ModelFramesWidget.hpp | 2 +- 11 files changed, 70 insertions(+), 43 deletions(-) diff --git a/rwviewer/ViewerWidget.cpp b/rwviewer/ViewerWidget.cpp index 1339d447..8bcd45b1 100644 --- a/rwviewer/ViewerWidget.cpp +++ b/rwviewer/ViewerWidget.cpp @@ -1,5 +1,5 @@ #include "ViewerWidget.hpp" -#include +#include #include #include #include @@ -187,7 +187,10 @@ void ViewerWidget::showObject(qint16 item) { dummyObject = gworld->createVehicle(item, {}); } - activeModel = dummyObject->model->resource; + RW_CHECK(dummyObject != nullptr, "Dummy Object is null"); + if (dummyObject != nullptr) { + activeModel = dummyObject->model->resource; + } } } diff --git a/rwviewer/ViewerWidget.hpp b/rwviewer/ViewerWidget.hpp index acffdf21..46089470 100644 --- a/rwviewer/ViewerWidget.hpp +++ b/rwviewer/ViewerWidget.hpp @@ -3,14 +3,18 @@ #define _VIEWERWIDGET_HPP_ #include #include -#include #include #include -#include -#include -#include +#include +#include +#include #include +// Prevent Qt from conflicting with glLoadGen +#define GL_ARB_debug_output +#define GL_KHR_debug +#include + class GameRenderer; class Model; class ViewerWidget : public QGLWidget diff --git a/rwviewer/ViewerWindow.cpp b/rwviewer/ViewerWindow.cpp index 1acd2d71..51faba3f 100644 --- a/rwviewer/ViewerWindow.cpp +++ b/rwviewer/ViewerWindow.cpp @@ -101,33 +101,10 @@ void ViewerWindow::closeEvent(QCloseEvent* event) void ViewerWindow::openAnimations() { -#if 0 QFileDialog dialog(this, "Open Animations", QDir::homePath(), "IFP Animations (*.ifp)"); if(dialog.exec()) { - std::ifstream dfile(dialog.selectedFiles().at(0).toStdString().c_str()); - 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; - } - - animationswidget->setAnimations(anims); + modelViewer->loadAnimations(dialog.selectedFiles()[0]); } -#endif } void ViewerWindow::loadGame() diff --git a/rwviewer/ViewerWindow.hpp b/rwviewer/ViewerWindow.hpp index 7dcc133f..44fe9e80 100644 --- a/rwviewer/ViewerWindow.hpp +++ b/rwviewer/ViewerWindow.hpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include @@ -13,6 +12,7 @@ class ObjectViewer; class ModelViewer; class ViewerWidget; class GameRenderer; +class QGLContext; class ViewerWindow : public QMainWindow { diff --git a/rwviewer/models/DFFFramesTreeModel.cpp b/rwviewer/models/DFFFramesTreeModel.cpp index ebf08576..5ecdbbde 100644 --- a/rwviewer/models/DFFFramesTreeModel.cpp +++ b/rwviewer/models/DFFFramesTreeModel.cpp @@ -1,5 +1,5 @@ #include "DFFFramesTreeModel.hpp" -#include +#include #include DFFFramesTreeModel::DFFFramesTreeModel(Model *m, Skeleton* skel, QObject* parent) diff --git a/rwviewer/models/DFFFramesTreeModel.hpp b/rwviewer/models/DFFFramesTreeModel.hpp index 7eca632f..4c4c1c9d 100644 --- a/rwviewer/models/DFFFramesTreeModel.hpp +++ b/rwviewer/models/DFFFramesTreeModel.hpp @@ -2,7 +2,7 @@ #ifndef _DFFFRAMESTREEMODEL_HPP_ #define _DFFFRAMESTREEMODEL_HPP_ #include -#include +#include class Model; class Skeleton; diff --git a/rwviewer/views/ModelViewer.cpp b/rwviewer/views/ModelViewer.cpp index 62946130..72a3b361 100644 --- a/rwviewer/views/ModelViewer.cpp +++ b/rwviewer/views/ModelViewer.cpp @@ -1,9 +1,10 @@ #include "ModelViewer.hpp" -#include -#include "ViewerWidget.hpp" -#include -#include #include +#include +#include +#include +#include +#include "ViewerWidget.hpp" ModelViewer::ModelViewer(ViewerWidget* viewer, QWidget* parent, Qt::WindowFlags f) : QWidget(parent, f), _world(nullptr), viewing(nullptr), skeleton(nullptr) @@ -14,10 +15,15 @@ ModelViewer::ModelViewer(ViewerWidget* viewer, QWidget* parent, Qt::WindowFlags 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); @@ -58,3 +64,34 @@ void ModelViewer::showObject(uint16_t object) skeleton = viewerWidget->currentObject()->skeleton; frames->setModel(viewing, skeleton); } + +void ModelViewer::loadAnimations(const QString& file) +{ + std::ifstream dfile(file.toStdString().c_str()); + 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->setAnimation(anim); +} diff --git a/rwviewer/views/ModelViewer.hpp b/rwviewer/views/ModelViewer.hpp index 93fb04da..7f290697 100644 --- a/rwviewer/views/ModelViewer.hpp +++ b/rwviewer/views/ModelViewer.hpp @@ -1,19 +1,20 @@ #pragma once #ifndef _MODELVIEWER_HPP_ #define _MODELVIEWER_HPP_ -#include -#include -#include #include #include #include #include #include +#include +#include +#include "AnimationListWidget.hpp" class ViewerWidget; class Model; class Skeleton; class ModelFramesWidget; +class Animation; class ModelViewer : public QWidget { @@ -28,6 +29,9 @@ class ModelViewer : public QWidget ViewerWidget* viewerWidget; ModelFramesWidget* frames; + + AnimationList loadedAnimations; + AnimationListWidget *animationWidget; public: ModelViewer(ViewerWidget *viewer = 0, QWidget* parent = 0, Qt::WindowFlags f = 0); @@ -52,6 +56,9 @@ public slots: void showObject(uint16_t object); void showData(GameWorld* world); + + void loadAnimations(const QString& file); + void playAnimation(Animation* anim); }; #endif diff --git a/rwviewer/views/ObjectViewer.hpp b/rwviewer/views/ObjectViewer.hpp index 9446247b..f6acc1fa 100644 --- a/rwviewer/views/ObjectViewer.hpp +++ b/rwviewer/views/ObjectViewer.hpp @@ -3,7 +3,6 @@ #define _OBJECTVIEWER_HPP_ #include #include -#include #include #include #include diff --git a/rwviewer/widgets/ModelFramesWidget.cpp b/rwviewer/widgets/ModelFramesWidget.cpp index 8e92bf78..63b8eed5 100644 --- a/rwviewer/widgets/ModelFramesWidget.cpp +++ b/rwviewer/widgets/ModelFramesWidget.cpp @@ -1,5 +1,5 @@ #include "ModelFramesWidget.hpp" -#include +#include #include void ModelFramesWidget::updateInfoBox(Model* model, ModelFrame *f) diff --git a/rwviewer/widgets/ModelFramesWidget.hpp b/rwviewer/widgets/ModelFramesWidget.hpp index e1719352..828979a8 100644 --- a/rwviewer/widgets/ModelFramesWidget.hpp +++ b/rwviewer/widgets/ModelFramesWidget.hpp @@ -4,7 +4,7 @@ #include #include #include "models/DFFFramesTreeModel.hpp" -#include +#include #include #include