asset browser: implement some overlay functionality

This commit is contained in:
sshumakov3
2020-11-16 23:22:54 +03:00
parent f1ffd12bbb
commit d76386348f
10 changed files with 255 additions and 109 deletions

View File

@@ -12,8 +12,6 @@
using namespace noggit::Red::AssetBrowser;
static const float XSENS = 15.0f;
static const float YSENS = 15.0f;
ModelViewer::ModelViewer(QWidget* parent)
: PreviewRenderer(0, 0, noggit::NoggitRenderContext::ASSET_BROWSER, parent)
@@ -26,6 +24,8 @@ ModelViewer::ModelViewer(QWidget* parent)
moving = strafing = updown = lookat = turn = 0.0f;
mousedir = -1.0f;
_move_sensitivity = _settings->value("assetBrowser/move_sensitivity", 15.0f).toFloat() / 30.0f;
_update_every_event_loop.start (0);
connect (&_update_every_event_loop, &QTimer::timeout, [this] { update(); });
}
@@ -103,8 +103,8 @@ void ModelViewer::mouseMoveEvent(QMouseEvent* event)
if (look)
{
_camera.add_to_yaw(math::degrees(relative_movement.dx() / XSENS));
_camera.add_to_pitch(math::degrees(mousedir * relative_movement.dy() / YSENS));
_camera.add_to_yaw(math::degrees(relative_movement.dx() / 20.0f));
_camera.add_to_pitch(math::degrees(mousedir * relative_movement.dy() / 20.0f));
}
_last_mouse_pos = event->pos();
@@ -122,7 +122,16 @@ void ModelViewer::mouseReleaseEvent(QMouseEvent* event)
void ModelViewer::wheelEvent(QWheelEvent* event)
{
if (event->angleDelta().y() > 0)
{
_move_sensitivity = std::min(_move_sensitivity + 0.5f / 30.0f, 1.0f);
}
else
{
_move_sensitivity = std::max(_move_sensitivity - 0.5f / 30.0f, 1.0f / 30.0f);
}
emit sensitivity_changed();
}
void ModelViewer::keyReleaseEvent(QKeyEvent* event)
@@ -167,46 +176,46 @@ void ModelViewer::keyPressEvent(QKeyEvent* event)
{
if (event->key() == Qt::Key_W)
{
moving = 0.5f;
moving = _move_sensitivity;
}
if (event->key() == Qt::Key_S)
{
moving = -0.5f;
moving = -_move_sensitivity;
}
if (event->key() == Qt::Key_Up)
{
lookat = 0.5f;
lookat = _move_sensitivity;
}
if (event->key() == Qt::Key_Down)
{
lookat = -0.5f;
lookat = -_move_sensitivity;
}
if (event->key() == Qt::Key_Right)
{
turn = 0.5f;
turn = _move_sensitivity;
}
if (event->key() == Qt::Key_Left)
{
turn = -0.5f;
turn = -_move_sensitivity;
}
if (event->key() == Qt::Key_D)
{
strafing = 0.5f;
strafing = _move_sensitivity;
}
if (event->key() == Qt::Key_A)
{
strafing = -0.5f;
strafing = -_move_sensitivity;
}
if (event->key() == Qt::Key_Q)
{
updown = 0.5f;
updown = _move_sensitivity;
}
if (event->key() == Qt::Key_E)
{
updown = -0.5f;
updown = -_move_sensitivity;
}
}

View File

@@ -34,9 +34,12 @@ namespace noggit
public:
explicit ModelViewer(QWidget* parent = nullptr);
void setModel(std::string const& filename) override;
void setMoveSensitivity(float s) { _move_sensitivity = s / 30.0f; }
float getMoveSensitivity() { return _move_sensitivity; }
signals:
void resized();
void sensitivity_changed();
private:
@@ -47,6 +50,7 @@ namespace noggit
QElapsedTimer _startup_time;
qreal _last_update = 0.f;
float _move_sensitivity = 0.5f;
void tick(float dt);
float aspect_ratio() const override;

View File

@@ -1,6 +1,4 @@
#include "AssetBrowser.hpp"
#include <ui_AssetBrowser.h>
#include <ui_AssetBrowserOverlay.h>
#include <noggit/MPQ.h>
#include <noggit/Log.h>
#include <noggit/ContextObject.hpp>
@@ -13,6 +11,8 @@
#include <QPixmap>
#include <QIcon>
#include <QDialog>
#include <QDial>
#include <QSlider>
using namespace noggit::Red::AssetBrowser::Ui;
@@ -31,8 +31,8 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
// test
auto overlay = new QWidget(ui->viewport);
auto overlay_ui = ::Ui::AssetBrowserOverlay();
overlay_ui.setupUi(overlay);
viewport_overlay_ui = new ::Ui::AssetBrowserOverlay();
viewport_overlay_ui->setupUi(overlay);
overlay->setAttribute(Qt::WA_TranslucentBackground);
overlay->setMouseTracking(true);
overlay->setGeometry(0,0,ui->viewport->width(),ui->viewport->height());
@@ -47,6 +47,8 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
ui->viewport->installEventFilter(overlay);
overlay->show();
ui->viewport->setLightDirection(120.0f, 60.0f);
// drag'n'drop
ui->listfileTree->setDragEnabled(true);
ui->listfileTree->setDragDropMode(QAbstractItemView::DragOnly);
@@ -79,36 +81,69 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
}
);
// Handle preview rendering
// Handle preview rendering and drag
connect(ui->listfileTree, &QTreeView::expanded
,[this] (const QModelIndex& index)
{
for (int i = 0; i != _sort_model->rowCount(index); ++i)
{
auto child = index.child(i, 0);
auto path = child.data(Qt::UserRole).toString();
if (path.endsWith(".wmo") || path.endsWith(".m2"))
{
for (int i = 0; i != _sort_model->rowCount(index); ++i)
{
auto child = index.child(i, 0);
auto path = child.data(Qt::UserRole).toString();
if (path.endsWith(".wmo") || path.endsWith(".m2"))
{
_preview_renderer->setModelOffscreen(path.toStdString());
_preview_renderer->setModelOffscreen(path.toStdString());
auto preview_pixmap = _preview_renderer->renderToPixmap();
auto item = _model->itemFromIndex(_sort_model->mapToSource(child));
item->setIcon(QIcon(*preview_pixmap));
}
}
auto preview_pixmap = _preview_renderer->renderToPixmap();
auto item = _model->itemFromIndex(_sort_model->mapToSource(child));
item->setIcon(QIcon(*preview_pixmap));
item->setDragEnabled(true);
item->setFlags(item->flags() | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
}
}
}
);
// Handle search
connect(ui->searchButton, &QPushButton::clicked
,[this]()
{
_sort_model->setFilterFixedString(ui->searchField->text());
}
{
_sort_model->setFilterFixedString(ui->searchField->text());
}
);
connect(viewport_overlay_ui->lightDirY, &QDial::valueChanged
,[this]()
{
ui->viewport->setLightDirection(viewport_overlay_ui->lightDirY->value(),
viewport_overlay_ui->lightDirZ->value());
}
);
connect(viewport_overlay_ui->lightDirZ, &QSlider::valueChanged
,[this]()
{
ui->viewport->setLightDirection(viewport_overlay_ui->lightDirY->value(),
viewport_overlay_ui->lightDirZ->value());
}
);
connect(viewport_overlay_ui->moveSensitivitySlider, &QSlider::valueChanged
,[this]()
{
ui->viewport->setMoveSensitivity(static_cast<float>(viewport_overlay_ui->moveSensitivitySlider->value()));
}
);
connect(ui->viewport, &ModelViewer::sensitivity_changed
,[this]()
{
viewport_overlay_ui->moveSensitivitySlider->setValue(ui->viewport->getMoveSensitivity() * 30.0f);
}
);
_wmo_group_and_lod_regex = QRegularExpression(".+_\\d{3}(_lod.+)*.wmo");
updateModelData();

View File

@@ -2,6 +2,7 @@
#define NOGGIT_ASSETBROWSER_HPP
#include <ui_AssetBrowser.h>
#include <ui_AssetBrowserOverlay.h>
#include <noggit/Red/AssetBrowser/Ui/Model/TreeManager.hpp>
#include <noggit/Red/PreviewRenderer/PreviewRenderer.hpp>
@@ -23,6 +24,7 @@ namespace noggit
private:
::Ui::AssetBrowser* ui;
::Ui::AssetBrowserOverlay* viewport_overlay_ui;
QStandardItemModel* _model;
QSortFilterProxyModel* _sort_model;
PreviewRenderer* _preview_renderer;

View File

@@ -6,77 +6,18 @@
<rect>
<x>0</x>
<y>0</y>
<width>896</width>
<height>663</height>
<width>890</width>
<height>647</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pushButton_6">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButton">
<property name="text">
<string>T</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_5">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
@@ -133,6 +74,34 @@
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="cameraXButton">
<property name="text">
<string>X</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="cameraYButton">
<property name="text">
<string>Y</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="cameraZButton">
<property name="text">
<string>Z</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
@@ -147,7 +116,30 @@
</spacer>
</item>
<item>
<widget class="QDial" name="dial"/>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Move sensitivity:</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="moveSensitivitySlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>30</number>
</property>
<property name="value">
<number>15</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
@@ -160,21 +152,102 @@
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<height>500</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_4">
<widget class="QLabel" name="label">
<property name="text">
<string>Test</string>
<string>Light direction:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QDial" name="lightDirZ">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="minimum">
<number>-180</number>
</property>
<property name="maximum">
<number>180</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>60</number>
</property>
<property name="wrapping">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="lightDirY">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>100</height>
</size>
</property>
<property name="minimum">
<number>-180</number>
</property>
<property name="maximum">
<number>180</number>
</property>
<property name="value">
<number>120</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>

View File

@@ -27,8 +27,6 @@ QStandardItem* TreeManager::addItem(QString path)
child->setData(QVariant(path_remainder), Qt::UserRole);
child->setEditable(false);
child->setCheckable(false);
child->setDragEnabled(true);
child->setFlags(child->flags() | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
layered_items[path_remainder] = child;
}

View File

@@ -41,6 +41,8 @@ PreviewRenderer::PreviewRenderer(int width, int height, noggit::NoggitRenderCont
_offscreen_context.makeCurrent(&_offscreen_surface);
opengl::context::scoped_setter const context_set (::gl, &_offscreen_context);
_light_dir = math::vector_3d(0.0f, 1.0f, 0.0f);
}
void PreviewRenderer::setModel(std::string const &filename)
@@ -70,16 +72,26 @@ void PreviewRenderer::setModel(std::string const &filename)
throw std::logic_error("Preview renderer only supports viewing M2 and WMO for now.");
}
auto diffuse_color = _settings->value("assetBrowser/diffuse_light").value<QColor>();
auto diffuse_color = _settings->value("assetBrowser/diffuse_light",
QVariant::fromValue(QColor::fromRgbF(1.0f, 0.532352924f, 0.0f))).value<QColor>();
_diffuse_light = {static_cast<float>(diffuse_color.redF()),
static_cast<float>(diffuse_color.greenF()),
static_cast<float>(diffuse_color.blueF())};
auto ambient_color = _settings->value("assetBrowser/ambient_light").value<QColor>();
auto ambient_color = _settings->value("assetBrowser/ambient_light",
QVariant::fromValue(QColor::fromRgbF(0.407770514f, 0.508424163f, 0.602650642f))).value<QColor>();
_ambient_light = {static_cast<float>(ambient_color.redF()),
static_cast<float>(ambient_color.greenF()),
static_cast<float>(ambient_color.blueF())};
auto background_color = _settings->value("assetBrowser/background_color",
QVariant::fromValue(QColor(127, 127, 127))).value<QColor>();
_background_color = {static_cast<float>(background_color.redF()),
static_cast<float>(background_color.greenF()),
static_cast<float>(background_color.blueF())};
resetCamera();
}
@@ -211,7 +223,7 @@ void PreviewRenderer::draw()
wmo_program.uniform("draw_fog", 0);
wmo_program.uniform("exterior_light_dir", math::vector_3d(0.0f, 1.0f, 0.0f));
wmo_program.uniform("exterior_light_dir", _light_dir);
wmo_program.uniform("exterior_diffuse_color", _diffuse_light);
wmo_program.uniform("exterior_ambient_color", _ambient_light);
@@ -254,7 +266,7 @@ void PreviewRenderer::draw()
m2_shader.uniform("tex2", 1);
m2_shader.uniform("draw_fog", 0);
m2_shader.uniform("light_dir", math::vector_3d(0.0f, 1.0f, 0.0f));
m2_shader.uniform("light_dir", _light_dir);
m2_shader.uniform("diffuse_color", _diffuse_light);
m2_shader.uniform("ambient_color", _ambient_light);

View File

@@ -37,6 +37,8 @@ namespace noggit::Red
void setModelOffscreen(std::string const& filename);
virtual void setPrefab(std::string const& filename) {};
void setLightDirection(float y, float z) { _light_dir.y = y / 180.0f; _light_dir.x = z / 180.0f; };
protected:
noggit::camera _camera;
@@ -72,8 +74,10 @@ namespace noggit::Red
QOpenGLFramebufferObjectFormat _fmt;
QOffscreenSurface _offscreen_surface;
math::vector_3d _background_color;
math::vector_3d _diffuse_light;
math::vector_3d _ambient_light;
math::vector_3d _light_dir;
};
}

View File

@@ -214,12 +214,12 @@ namespace noggit
ui->_theme->setCurrentText(_settings->value("theme", "Dark").toString());
ui->assetBrowserBgCol->setColor(_settings->value("assetBrowser/background_color",
QVariant::fromValue(QColor(127, 127, 127))).value<QColor>());
QVariant::fromValue(QColor(127, 127, 127))).value<QColor>());
ui->assetBrowserDiffuseLight->setColor(_settings->value("assetBrowser/diffuse_light",
QVariant::fromValue(QColor::fromRgbF(1.0f, 0.532352924f, 0.0f))).value<QColor>());
QVariant::fromValue(QColor::fromRgbF(1.0f, 0.532352924f, 0.0f))).value<QColor>());
ui->assetBrowserAmbientLight->setColor(_settings->value("assetBrowser/ambient_light",
QVariant::fromValue(QColor::fromRgbF(0.407770514f, 0.508424163f, 0.602650642f))).value<QColor>());
QVariant::fromValue(QColor::fromRgbF(0.407770514f, 0.508424163f, 0.602650642f))).value<QColor>());
ui->assetBrowserCopyToClipboard->setChecked(_settings->value("assetBrowser/copy_to_clipboard", true).toBool());
ui->assetBrowserDefaultModel->setText(_settings->value("assetBrowser/default_model",

View File

@@ -82,7 +82,7 @@
<string/>
</property>
<property name="currentIndex">
<number>1</number>
<number>4</number>
</property>
<property name="tabBarAutoHide">
<bool>false</bool>
@@ -1834,6 +1834,15 @@
<height>0</height>
</size>
</property>
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>30.000000000000000</double>
</property>
<property name="value">
<double>15.000000000000000</double>
</property>
</widget>
</item>
<item>