From 1b9687dedd3a44a4633563ab711e069dd5142ede Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Wed, 12 Feb 2014 06:42:07 +0000 Subject: [PATCH] Frame information --- rwengine/include/render/Model.hpp | 3 ++ rwviewer/CMakeLists.txt | 4 +- rwviewer/DFFFramesTreeModel.cpp | 78 +++++++++++++++++++++++++++++++ rwviewer/DFFFramesTreeModel.hpp | 27 +++++++++++ rwviewer/ModelFramesWidget.cpp | 26 +++++++++++ rwviewer/ModelFramesWidget.hpp | 23 +++++++++ rwviewer/ViewerWidget.cpp | 22 ++++++--- rwviewer/ViewerWidget.hpp | 6 ++- rwviewer/ViewerWindow.cpp | 15 +++++- rwviewer/ViewerWindow.hpp | 4 +- 10 files changed, 197 insertions(+), 11 deletions(-) create mode 100644 rwviewer/DFFFramesTreeModel.cpp create mode 100644 rwviewer/DFFFramesTreeModel.hpp create mode 100644 rwviewer/ModelFramesWidget.cpp create mode 100644 rwviewer/ModelFramesWidget.hpp diff --git a/rwengine/include/render/Model.hpp b/rwengine/include/render/Model.hpp index 3e8fed73..a610cd41 100644 --- a/rwengine/include/render/Model.hpp +++ b/rwengine/include/render/Model.hpp @@ -51,6 +51,9 @@ public: glm::mat4 getMatrix() const { return (parentFrame? parentFrame->getMatrix() : glm::mat4()) * matrix; } + + ModelFrame* getParent() const + { return parentFrame; } const std::vector& getChildren() const { return childs; } diff --git a/rwviewer/CMakeLists.txt b/rwviewer/CMakeLists.txt index db893bc5..cfc7810f 100644 --- a/rwviewer/CMakeLists.txt +++ b/rwviewer/CMakeLists.txt @@ -8,7 +8,9 @@ add_executable(rwviewer ViewerWindow.cpp ViewerWidget.cpp IMGArchiveModel.cpp - ArchiveContentsWidget.cpp) + ArchiveContentsWidget.cpp + DFFFramesTreeModel.cpp + ModelFramesWidget.cpp) include_directories(../rwengine/include /usr/include/bullet) diff --git a/rwviewer/DFFFramesTreeModel.cpp b/rwviewer/DFFFramesTreeModel.cpp new file mode 100644 index 00000000..bb6854a6 --- /dev/null +++ b/rwviewer/DFFFramesTreeModel.cpp @@ -0,0 +1,78 @@ +#include "DFFFramesTreeModel.hpp" +#include + +DFFFramesTreeModel::DFFFramesTreeModel(Model* m, QObject* parent) + : QAbstractItemModel(parent), model(m) +{ + +} + +int DFFFramesTreeModel::columnCount(const QModelIndex& parent) const +{ + return 1; +} + +int DFFFramesTreeModel::rowCount(const QModelIndex& parent) const +{ + ModelFrame* f = static_cast(parent.internalPointer()); + if(f) { + return f->getChildren().size(); + } + + if(parent.row() == -1) { + return 1; + } + + return 0; +} + +QModelIndex DFFFramesTreeModel::index(int row, int column, const QModelIndex& parent) const +{ + if(parent.row() == -1 && parent.column() == -1) { + return createIndex(row, column, model->frames[model->rootFrameIdx]); + } + ModelFrame* f = static_cast(parent.internalPointer()); + ModelFrame* p = f->getChildren()[row]; + return createIndex(row, column, p); +} + +QModelIndex DFFFramesTreeModel::parent(const QModelIndex& child) const +{ + ModelFrame* c = static_cast(child.internalPointer()); + if(c->getParent()) { + auto cp = c->getParent(); + if(cp->getParent()) { + for(int i = 0; i < cp->getParent()->getChildren().size(); ++i) { + if(cp->getParent()->getChildren()[i] == c->getParent()) { + return createIndex(i, 0, c->getParent()); + } + } + } + else { + return createIndex(0,0, cp); + } + } + return QModelIndex(); +} + +QVariant DFFFramesTreeModel::data(const QModelIndex& index, int role) const +{ + ModelFrame* f = static_cast(index.internalPointer()); + if(role == Qt::DisplayRole) { + if(index.column() == 0) { + return QString(f->getName().c_str()); + } + } + return QVariant(); +} + +QVariant DFFFramesTreeModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if(orientation == Qt::Horizontal) { + if(role == Qt::DisplayRole) { + return "Name"; + } + } + return QVariant(); +} + diff --git a/rwviewer/DFFFramesTreeModel.hpp b/rwviewer/DFFFramesTreeModel.hpp new file mode 100644 index 00000000..0d746e18 --- /dev/null +++ b/rwviewer/DFFFramesTreeModel.hpp @@ -0,0 +1,27 @@ +#pragma once +#ifndef _DFFFRAMESTREEMODEL_HPP_ +#define _DFFFRAMESTREEMODEL_HPP_ +#include + +class Model; +class DFFFramesTreeModel : public QAbstractItemModel +{ + Model* model; +public: + + explicit DFFFramesTreeModel(Model* m, QObject* parent = 0); + + virtual int columnCount(const QModelIndex& parent = QModelIndex()) const; + + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; + + virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + + virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; + + virtual QModelIndex parent(const QModelIndex& child) const; + + virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; +}; + +#endif \ No newline at end of file diff --git a/rwviewer/ModelFramesWidget.cpp b/rwviewer/ModelFramesWidget.cpp new file mode 100644 index 00000000..47d410f7 --- /dev/null +++ b/rwviewer/ModelFramesWidget.cpp @@ -0,0 +1,26 @@ +#include "ModelFramesWidget.hpp" + +ModelFramesWidget::ModelFramesWidget(QWidget* parent, Qt::WindowFlags flags) +: QDockWidget(parent, flags), gmodel(nullptr), framemodel(nullptr) +{ + setWindowTitle("Frames"); + tree = new QTreeView; + setWidget(tree); +} + +void ModelFramesWidget::setModel(Model* model) +{ + if(framemodel) { + delete framemodel; + framemodel = nullptr; + tree->setModel(nullptr); + } + gmodel = model; + if(model != nullptr) { + framemodel = new DFFFramesTreeModel(model, this); + tree->setModel(framemodel); + } + else { + tree->setDisabled(true); + } +} diff --git a/rwviewer/ModelFramesWidget.hpp b/rwviewer/ModelFramesWidget.hpp new file mode 100644 index 00000000..6a50f24b --- /dev/null +++ b/rwviewer/ModelFramesWidget.hpp @@ -0,0 +1,23 @@ +#pragma once +#ifndef _MODELFRAMESWIDGET_HPP_ +#define _MODELFRAMESWIDGET_HPP_ +#include +#include +#include "DFFFramesTreeModel.hpp" + +class Model; +class ModelFramesWidget : public QDockWidget +{ + Q_OBJECT + + Model* gmodel; + DFFFramesTreeModel* framemodel; + QTreeView* tree; + +public: + ModelFramesWidget(QWidget* parent = 0, Qt::WindowFlags flags = 0); + + void setModel(Model* model); +}; + +#endif \ No newline at end of file diff --git a/rwviewer/ViewerWidget.cpp b/rwviewer/ViewerWidget.cpp index 9f2c1443..77875761 100644 --- a/rwviewer/ViewerWidget.cpp +++ b/rwviewer/ViewerWidget.cpp @@ -4,7 +4,7 @@ #include ViewerWidget::ViewerWidget(QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f) -: QGLWidget(parent, shareWidget, f), gworld(nullptr), currentModel(nullptr), +: QGLWidget(parent, shareWidget, f), gworld(nullptr), cmodel(nullptr), viewDistance(1.f), dragging(false), fm(ViewerWidget::UNK) { } @@ -42,7 +42,7 @@ void ViewerWidget::paintGL() r.camera.frustum.fov = 60.f; r.camera.frustum.aspectRatio = width()/(height()*1.f); - if(currentModel) { + if(cmodel) { glEnable(GL_DEPTH_TEST); glm::mat4 m; @@ -64,7 +64,7 @@ void ViewerWidget::paintGL() glUniformMatrix4fv(r.uniView, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(r.uniProj, 1, GL_FALSE, glm::value_ptr(proj)); - gworld->renderer.renderModel(currentModel, m); + gworld->renderer.renderModel(cmodel, m); } } @@ -75,7 +75,7 @@ GameWorld* ViewerWidget::world() void ViewerWidget::showFile(const QString& file) { - currentModel = nullptr; + cmodel = nullptr; currentFile = file; QString low = file.toLower(); if(low.endsWith("dff")) { @@ -96,10 +96,10 @@ void ViewerWidget::showDFF(const QString& file) auto mit = gworld->gameData.models.find(basename.toStdString()); if(mit != gworld->gameData.models.end()) { // TODO better error handling - currentModel = mit->second; + cmodel = mit->second; float radius = 0.f; for(auto& g - : currentModel->geometries) { + : cmodel->geometries) { radius = std::max( radius, glm::length(g->geometryBounds.center)+g->geometryBounds.radius); @@ -115,6 +115,16 @@ void ViewerWidget::showTXD(const QString& file) fm = ViewerWidget::TXD; } +Model* ViewerWidget::currentModel() const +{ + return cmodel; +} + +ViewerWidget::FileMode ViewerWidget::fileMode() const +{ + return fm; +} + void ViewerWidget::mousePressEvent(QMouseEvent* e) { dragging = true; diff --git a/rwviewer/ViewerWidget.hpp b/rwviewer/ViewerWidget.hpp index b88abf4f..75801069 100644 --- a/rwviewer/ViewerWidget.hpp +++ b/rwviewer/ViewerWidget.hpp @@ -16,7 +16,7 @@ class ViewerWidget : public QGLWidget QTimer timer; GameWorld* gworld; - Model* currentModel; + Model* cmodel; float viewDistance; glm::vec2 viewAngles; @@ -38,6 +38,10 @@ public: virtual void paintGL(); + FileMode fileMode() const; + + Model* currentModel() const; + GameWorld* world(); public slots: diff --git a/rwviewer/ViewerWindow.cpp b/rwviewer/ViewerWindow.cpp index 732b54ab..775292a8 100644 --- a/rwviewer/ViewerWindow.cpp +++ b/rwviewer/ViewerWindow.cpp @@ -2,6 +2,7 @@ #include #include "ViewerWidget.hpp" #include "ArchiveContentsWidget.hpp" +#include "ModelFramesWidget.hpp" #include #include #include @@ -20,6 +21,10 @@ ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags): QMainWindow( archivewidget->setObjectName("archivewidget"); this->addDockWidget(Qt::LeftDockWidgetArea, archivewidget); + frameswidget = new ModelFramesWidget; + frameswidget->setObjectName("frameswidget"); + this->addDockWidget(Qt::RightDockWidgetArea, frameswidget); + QMenuBar* mb = this->menuBar(); QMenu* file = mb->addMenu("&File"); file->addAction("Open &Archive", this, SLOT(openArchive())); @@ -33,7 +38,7 @@ ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags): QMainWindow( file->addAction("E&xit", QApplication::instance(), SLOT(quit()), QKeySequence::Quit); connect(archivewidget, SIGNAL(selectedFileChanged(QString)), viewer, SLOT(showFile(QString))); - connect(viewer, SIGNAL(fileOpened(QString)), SLOT(updateTitle(QString))); + connect(viewer, SIGNAL(fileOpened(QString)), SLOT(openFileChanged(QString))); QSettings settings("OpenRW", "rwviewer"); restoreGeometry(settings.value("geometry").toByteArray()); @@ -83,9 +88,15 @@ void ViewerWindow::openArchive() } } -void ViewerWindow::updateTitle(const QString& name) +void ViewerWindow::openFileChanged(const QString& name) { setWindowTitle(name); + if(viewer->fileMode() == ViewerWidget::DFF) { + frameswidget->setModel(viewer->currentModel()); + } + else { + frameswidget->setModel(nullptr); + } } void ViewerWindow::openRecent() diff --git a/rwviewer/ViewerWindow.hpp b/rwviewer/ViewerWindow.hpp index 1fc7789f..afb52f1c 100644 --- a/rwviewer/ViewerWindow.hpp +++ b/rwviewer/ViewerWindow.hpp @@ -3,6 +3,7 @@ #define _VIEWERWINDOW_HPP_ #include +class ModelFramesWidget; class ArchiveContentsWidget; class ViewerWidget; class ViewerWindow : public QMainWindow @@ -11,6 +12,7 @@ class ViewerWindow : public QMainWindow ViewerWidget* viewer; ArchiveContentsWidget* archivewidget; + ModelFramesWidget* frameswidget; public: ViewerWindow(QWidget* parent = 0, Qt::WindowFlags flags = 0); @@ -22,10 +24,10 @@ public: public slots: void openArchive(); - void updateTitle(const QString& name); private slots: + void openFileChanged(const QString& name); void openRecent(); private: