//// Created by Bradley Austin Davis on 2018/10/21// Copyright 2014 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "PlayerWindow.h" #include <QtCore/QTimer>#include <QtCore/QByteArray>#include <QtCore/QBuffer>#include <QtGui/QResizeEvent>#include <QtGui/QImageReader>#include <QtGui/QScreen>#include <QtWidgets/QFileDialog> #include <gpu/FrameIO.h> //#define FRAME_PLAYER_TRACING PlayerWindow::PlayerWindow() { installEventFilter(this); setFlags(Qt::MSWindowsOwnDC | Qt::Window | Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint); #ifdef USE_GL setSurfaceType(QSurface::OpenGLSurface);#else setSurfaceType(QSurface::VulkanSurface);#endif setGeometry(QRect(QPoint(), QSize(800, 600))); create(); show(); // Ensure the window is visible and the GL context is valid QCoreApplication::processEvents(); _renderThread.initialize(this);} PlayerWindow::~PlayerWindow() {} bool PlayerWindow::eventFilter(QObject* obj, QEvent* event) { if (event->type() == QEvent::Close) { _renderThread.terminate(); } return QWindow::eventFilter(obj, event);} void PlayerWindow::loadFrame() { static const QString LAST_FILE_KEY{ "lastFile" }; auto lastScene = _settings.value(LAST_FILE_KEY); QString openDir; if (lastScene.isValid()) { QFileInfo lastSceneInfo(lastScene.toString()); if (lastSceneInfo.absoluteDir().exists()) { openDir = lastSceneInfo.absolutePath(); } } QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), openDir, tr("GPU Frames (*.hfb)")); if (fileName.isNull()) { return; } _settings.setValue(LAST_FILE_KEY, fileName); loadFrame(fileName);} void PlayerWindow::keyPressEvent(QKeyEvent* event) { bool isShifted = event->modifiers().testFlag(Qt::ShiftModifier); float moveScale = isShifted ? 10.0f : 1.0f; switch (event->key()) { case Qt::Key_F1: loadFrame(); return; case Qt::Key_F3:#ifdef USE_GL _renderThread.testGlTransfer();#endif return; case Qt::Key_F4: //_renderThread.testVkTransfer(); return; case Qt::Key_W: _renderThread.move(vec3{ 0, 0, -0.1f } * moveScale); return; case Qt::Key_S: _renderThread.move(vec3{ 0, 0, 0.1f } * moveScale); return; case Qt::Key_A: _renderThread.move(vec3{ -0.1f, 0, 0 } * moveScale); return; case Qt::Key_D: _renderThread.move(vec3{ 0.1f, 0, 0 } * moveScale); return; case Qt::Key_E: _renderThread.move(vec3{ 0, 0.1f, 0 } * moveScale); return; case Qt::Key_F: _renderThread.move(vec3{ 0, -0.1f, 0 } * moveScale); return; default: break; }} void PlayerWindow::resizeEvent(QResizeEvent* ev) { _renderThread.resize(ev->size());} static const QString DEFAULT_TRACING_RULES = "trace.*=true\n" \ "*.detail=false\n"; void PlayerWindow::loadFrame(const QString& path) {#ifdef FRAME_PLAYER_TRACING DependencyManager::get<tracing::Tracer>()->startTracing(); QLoggingCategory::setFilterRules(DEFAULT_TRACING_RULES); QTimer::singleShot(10 * 1000, [] { DependencyManager::get<tracing::Tracer>()->stopTracing(); DependencyManager::get<tracing::Tracer>()->serialize("D:/frames/trace-{DATE}_{TIME}.json.gz"); });#endif auto frame = gpu::readFrame(path.toStdString(), _renderThread._externalTexture); if (frame) { _renderThread.submitFrame(frame); if (!_renderThread.isThreaded()) { _renderThread.process(); } } if (frame->framebuffer) { const auto& fbo = *frame->framebuffer; glm::uvec2 size{ fbo.getWidth(), fbo.getHeight() }; auto screenSize = screen()->size(); static const glm::uvec2 maxSize{ screenSize.width() - 100, screenSize.height() - 100 }; while (glm::any(glm::greaterThan(size, maxSize))) { size /= 2; } resize(size.x, size.y); }}
//
// Created by Bradley Austin Davis on 2018/10/21
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "PlayerWindow.h"
#include <QtCore/QTimer>
#include <QtCore/QByteArray>
#include <QtCore/QBuffer>
#include <QtGui/QResizeEvent>
#include <QtGui/QImageReader>
#include <QtGui/QScreen>
#include <QtWidgets/QFileDialog>
#include <gpu/FrameIO.h>
//#define FRAME_PLAYER_TRACING
PlayerWindow::PlayerWindow() {
installEventFilter(this);
setFlags(Qt::MSWindowsOwnDC | Qt::Window | Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint);
#ifdef USE_GL
setSurfaceType(QSurface::OpenGLSurface);
#else
setSurfaceType(QSurface::VulkanSurface);
#endif
setGeometry(QRect(QPoint(), QSize(800, 600)));
create();
show();
// Ensure the window is visible and the GL context is valid
QCoreApplication::processEvents();
_renderThread.initialize(this);
}
PlayerWindow::~PlayerWindow() {
}
bool PlayerWindow::eventFilter(QObject* obj, QEvent* event) {
if (event->type() == QEvent::Close) {
_renderThread.terminate();
}
return QWindow::eventFilter(obj, event);
}
void PlayerWindow::loadFrame() {
static const QString LAST_FILE_KEY{ "lastFile" };
auto lastScene = _settings.value(LAST_FILE_KEY);
QString openDir;
if (lastScene.isValid()) {
QFileInfo lastSceneInfo(lastScene.toString());
if (lastSceneInfo.absoluteDir().exists()) {
openDir = lastSceneInfo.absolutePath();
}
}
QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), openDir, tr("GPU Frames (*.hfb)"));
if (fileName.isNull()) {
return;
}
_settings.setValue(LAST_FILE_KEY, fileName);
loadFrame(fileName);
}
void PlayerWindow::keyPressEvent(QKeyEvent* event) {
bool isShifted = event->modifiers().testFlag(Qt::ShiftModifier);
float moveScale = isShifted ? 10.0f : 1.0f;
switch (event->key()) {
case Qt::Key_F1:
loadFrame();
return;
case Qt::Key_F3:
#ifdef USE_GL
_renderThread.testGlTransfer();
#endif
return;
case Qt::Key_F4:
//_renderThread.testVkTransfer();
return;
case Qt::Key_W:
_renderThread.move(vec3{ 0, 0, -0.1f } * moveScale);
return;
case Qt::Key_S:
_renderThread.move(vec3{ 0, 0, 0.1f } * moveScale);
return;
case Qt::Key_A:
_renderThread.move(vec3{ -0.1f, 0, 0 } * moveScale);
return;
case Qt::Key_D:
_renderThread.move(vec3{ 0.1f, 0, 0 } * moveScale);
return;
case Qt::Key_E:
_renderThread.move(vec3{ 0, 0.1f, 0 } * moveScale);
return;
case Qt::Key_F:
_renderThread.move(vec3{ 0, -0.1f, 0 } * moveScale);
return;
default:
break;
}
}
void PlayerWindow::resizeEvent(QResizeEvent* ev) {
_renderThread.resize(ev->size());
}
static const QString DEFAULT_TRACING_RULES =
"trace.*=true\n" \
"*.detail=false\n";
void PlayerWindow::loadFrame(const QString& path) {
#ifdef FRAME_PLAYER_TRACING
DependencyManager::get<tracing::Tracer>()->startTracing();
QLoggingCategory::setFilterRules(DEFAULT_TRACING_RULES);
QTimer::singleShot(10 * 1000, [] {
DependencyManager::get<tracing::Tracer>()->stopTracing();
DependencyManager::get<tracing::Tracer>()->serialize("D:/frames/trace-{DATE}_{TIME}.json.gz");
});
#endif
auto frame = gpu::readFrame(path.toStdString(), _renderThread._externalTexture);
if (frame) {
_renderThread.submitFrame(frame);
if (!_renderThread.isThreaded()) {
_renderThread.process();
}
}
if (frame->framebuffer) {
const auto& fbo = *frame->framebuffer;
glm::uvec2 size{ fbo.getWidth(), fbo.getHeight() };
auto screenSize = screen()->size();
static const glm::uvec2 maxSize{ screenSize.width() - 100, screenSize.height() - 100 };
while (glm::any(glm::greaterThan(size, maxSize))) {
size /= 2;
}
resize(size.x, size.y);
}
}