drag-and-drop #14
|
@ -1,7 +1,8 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
|
||||||
## ##
|
|
||||||
## Project for working with OpenGL and Qt6 widgets ##
|
## Project for working with OpenGL and Qt6 widgets ##
|
||||||
|
## ##
|
||||||
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
|
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
cmake_minimum_required(VERSION 3.23)
|
cmake_minimum_required(VERSION 3.23)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
|
||||||
## ##
|
|
||||||
## Project for working with OpenGL and Qt6 widgets ##
|
## Project for working with OpenGL and Qt6 widgets ##
|
||||||
|
## ##
|
||||||
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
|
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
# Qtk Library
|
# Qtk Library
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
|
||||||
## ##
|
|
||||||
## Project for working with OpenGL and Qt6 widgets ##
|
## Project for working with OpenGL and Qt6 widgets ##
|
||||||
|
## ##
|
||||||
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
|
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: MainWindow for creating an example Qt application ##
|
## About: Debug console for qtk views ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
@ -29,16 +29,5 @@ DebugConsole::DebugConsole(
|
||||||
auto qtkWidget = dynamic_cast<QtkWidget *>(owner);
|
auto qtkWidget = dynamic_cast<QtkWidget *>(owner);
|
||||||
if(qtkWidget) {
|
if(qtkWidget) {
|
||||||
connect(qtkWidget, &QtkWidget::sendLog, this, &DebugConsole::sendLog);
|
connect(qtkWidget, &QtkWidget::sendLog, this, &DebugConsole::sendLog);
|
||||||
sendLog(
|
|
||||||
"Debug console (" + name + ") attached to QtkWidget: '"
|
|
||||||
+ qtkWidget->objectName() + "'");
|
|
||||||
sendLog("Test\nLogging\t\n\tStuff", Status);
|
|
||||||
sendLog("Test\nLogging\t\n\tStuff", Debug);
|
|
||||||
sendLog("Test\nLogging\t\n\tStuff", Warn);
|
|
||||||
sendLog("Test\nLogging\t\n\tStuff", Error);
|
|
||||||
sendLog(
|
|
||||||
"Test\nLogging\t\n\tStuff that is really long and will wrap around but "
|
|
||||||
"it might not you don't know until you try",
|
|
||||||
Fatal);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Debug console for qtk views ##
|
## About: Debug console for qtk views ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -77,6 +77,10 @@ namespace Qtk {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* @param context Log context severity level.
|
||||||
|
* @return QColor corresponding with the message context.
|
||||||
|
*/
|
||||||
[[nodiscard]] QColor logColor(const DebugContext & context) const {
|
[[nodiscard]] QColor logColor(const DebugContext & context) const {
|
||||||
switch(context) {
|
switch(context) {
|
||||||
case Status:
|
case Status:
|
||||||
|
@ -94,6 +98,13 @@ namespace Qtk {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefixes a log message to add context level.
|
||||||
|
*
|
||||||
|
* @param message The message to prefix.
|
||||||
|
* @param context The log context severity level.
|
||||||
|
* @return The log message prefixed with the DebugContext level.
|
||||||
|
*/
|
||||||
[[nodiscard]] QString logPrefix(
|
[[nodiscard]] QString logPrefix(
|
||||||
QString & message, const DebugContext & context) {
|
QString & message, const DebugContext & context) {
|
||||||
QString prefix;
|
QString prefix;
|
||||||
|
@ -121,8 +132,8 @@ namespace Qtk {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextEdit * mConsole;
|
|
||||||
Ui::DebugConsole * ui_;
|
Ui::DebugConsole * ui_;
|
||||||
|
QTextEdit * mConsole;
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Classes for managing objects and data within a scene ##
|
## About: Example Qtk scene ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
||||||
#include <qtk/meshrenderer.h>
|
|
||||||
#include <qtk/model.h>
|
|
||||||
#include <qtk/texture.h>
|
|
||||||
|
|
||||||
#include "examplescene.h"
|
#include "examplescene.h"
|
||||||
#include "resources.h"
|
#include "resources.h"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Classes for managing objects and data within a scene ##
|
## About: Example Qtk scene ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
@ -9,11 +9,7 @@
|
||||||
#ifndef QTK_EXAMPLE_SCENE_H
|
#ifndef QTK_EXAMPLE_SCENE_H
|
||||||
#define QTK_EXAMPLE_SCENE_H
|
#define QTK_EXAMPLE_SCENE_H
|
||||||
|
|
||||||
#include <QMatrix4x4>
|
|
||||||
|
|
||||||
#include <qtk/camera3d.h>
|
|
||||||
#include <qtk/scene.h>
|
#include <qtk/scene.h>
|
||||||
#include <qtk/skybox.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example scene using QtkWidget to render 3D models and simple geometry within
|
* Example scene using QtkWidget to render 3D models and simple geometry within
|
||||||
|
@ -40,6 +36,7 @@ class ExampleScene : public Qtk::Scene {
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
ExampleScene();
|
ExampleScene();
|
||||||
|
|
||||||
~ExampleScene();
|
~ExampleScene();
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -50,6 +47,7 @@ class ExampleScene : public Qtk::Scene {
|
||||||
* Initialize objects within the scene
|
* Initialize objects within the scene
|
||||||
*/
|
*/
|
||||||
void init() override;
|
void init() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when OpenGL repaints the widget.
|
* Called when OpenGL repaints the widget.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Main program for practice using Qt6 widgets and OpenGL ##
|
## About: Main program for practice using Qt6 widgets and OpenGL ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
|
|
@ -1,19 +1,21 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: MainWindow for Qtk application ##
|
## About: MainWindow for Qtk application ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
||||||
#include <qtk/qtkapi.h>
|
|
||||||
|
|
||||||
#include "examplescene.h"
|
#include "examplescene.h"
|
||||||
#include "qtkmainwindow.h"
|
#include "qtkmainwindow.h"
|
||||||
#include "ui_qtkmainwindow.h"
|
#include "ui_qtkmainwindow.h"
|
||||||
|
|
||||||
MainWindow * MainWindow::mainWindow_ = Q_NULLPTR;
|
MainWindow * MainWindow::mainWindow_ = Q_NULLPTR;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Constructors / Destructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
|
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
|
||||||
ui_ = new Ui::MainWindow;
|
ui_ = new Ui::MainWindow;
|
||||||
setObjectName("MainWindow");
|
setObjectName("MainWindow");
|
||||||
|
@ -47,6 +49,25 @@ MainWindow::~MainWindow() {
|
||||||
delete ui_;
|
delete ui_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
MainWindow * MainWindow::getMainWindow() {
|
||||||
|
if(mainWindow_ == Q_NULLPTR) {
|
||||||
|
mainWindow_ = new MainWindow;
|
||||||
|
}
|
||||||
|
return mainWindow_;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qtk::QtkWidget * MainWindow::getQtkWidget(const QString & name) {
|
||||||
|
if(!views_.count(name)) {
|
||||||
|
return Q_NULLPTR;
|
||||||
|
}
|
||||||
|
return views_[name];
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::refreshScene(QString sceneName) {
|
void MainWindow::refreshScene(QString sceneName) {
|
||||||
|
// TODO: Select TreeView using sceneName>
|
||||||
ui_->qtk__TreeView->updateView(getQtkWidget(sceneName)->getScene());
|
ui_->qtk__TreeView->updateView(getQtkWidget(sceneName)->getScene());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: MainWindow for Qtk application ##
|
## About: MainWindow for Qtk application ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -40,22 +40,18 @@ class MainWindow : public QMainWindow {
|
||||||
* @param parent The parent for this QMainWindow
|
* @param parent The parent for this QMainWindow
|
||||||
*/
|
*/
|
||||||
explicit MainWindow(QWidget * parent = nullptr);
|
explicit MainWindow(QWidget * parent = nullptr);
|
||||||
|
|
||||||
~MainWindow() override;
|
~MainWindow() override;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Public Static Methods
|
* Public Methods
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows widgets to retrieve an instance of this root QMainWindow.
|
* Allows widgets to retrieve an instance of this root QMainWindow.
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
inline static MainWindow * getMainWindow() {
|
static MainWindow * getMainWindow();
|
||||||
if(mainWindow_ == Q_NULLPTR) {
|
|
||||||
mainWindow_ = new MainWindow;
|
|
||||||
}
|
|
||||||
return mainWindow_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessor for retrieving a QtkWidget by it's objectName.
|
* Accessor for retrieving a QtkWidget by it's objectName.
|
||||||
|
@ -64,22 +60,23 @@ class MainWindow : public QMainWindow {
|
||||||
* @param name The objectName associated with the QtkWidget.
|
* @param name The objectName associated with the QtkWidget.
|
||||||
* @return Pointer to an active QtkWidget or Q_NULLPTR is not found.
|
* @return Pointer to an active QtkWidget or Q_NULLPTR is not found.
|
||||||
*/
|
*/
|
||||||
inline Qtk::QtkWidget * getQtkWidget(const QString & name) {
|
Qtk::QtkWidget * getQtkWidget(const QString & name);
|
||||||
if(!views_.count(name)) {
|
|
||||||
return Q_NULLPTR;
|
|
||||||
}
|
|
||||||
return views_[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
/**
|
||||||
|
* Trigger a refresh for widgets related to a scene that has been updated.
|
||||||
|
* @param sceneName The name of the scene that has been modified.
|
||||||
|
*/
|
||||||
void refreshScene(QString sceneName);
|
void refreshScene(QString sceneName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MainWindow(const MainWindow &) {};
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
/** Do not allow copying */
|
||||||
|
MainWindow(const MainWindow &) {};
|
||||||
|
|
||||||
Ui::MainWindow * ui_ {};
|
Ui::MainWindow * ui_ {};
|
||||||
static MainWindow * mainWindow_;
|
static MainWindow * mainWindow_;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Main window for Qt6 OpenGL widget application ##
|
## About: QtkWidget for Qt desktop application ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
@ -9,9 +9,9 @@
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
#include "qtk/input.h"
|
#include <qtk/input.h>
|
||||||
#include "qtk/mesh.h"
|
#include <qtk/scene.h>
|
||||||
#include "qtk/scene.h"
|
#include <qtk/shape.h>
|
||||||
|
|
||||||
#include "debugconsole.h"
|
#include "debugconsole.h"
|
||||||
#include "qtkmainwindow.h"
|
#include "qtkmainwindow.h"
|
||||||
|
@ -23,12 +23,15 @@ using namespace Qtk;
|
||||||
* Constructors, Destructors
|
* Constructors, Destructors
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
QtkWidget::QtkWidget(QWidget * parent) :
|
||||||
|
QtkWidget(parent, "QtkWidget") {}
|
||||||
|
|
||||||
QtkWidget::QtkWidget(QWidget * parent, const QString & name) :
|
QtkWidget::QtkWidget(QWidget * parent, const QString & name) :
|
||||||
QtkWidget(parent, name, Q_NULLPTR) {}
|
QtkWidget(parent, name, Q_NULLPTR) {}
|
||||||
|
|
||||||
QtkWidget::QtkWidget(QWidget * parent, const QString & name, Scene * scene) :
|
QtkWidget::QtkWidget(QWidget * parent, const QString & name, Scene * scene) :
|
||||||
QOpenGLWidget(parent), mDebugLogger(Q_NULLPTR),
|
QOpenGLWidget(parent), mDebugLogger(Q_NULLPTR),
|
||||||
mConsole(new DebugConsole(this, name)) {
|
mConsole(new DebugConsole(this, name)), mScene(Q_NULLPTR) {
|
||||||
setScene(scene);
|
setScene(scene);
|
||||||
setObjectName(name);
|
setObjectName(name);
|
||||||
QSurfaceFormat format;
|
QSurfaceFormat format;
|
||||||
|
@ -65,10 +68,6 @@ QAction * QtkWidget::getActionToggleConsole() {
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Public Inherited Virtual Methods
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void QtkWidget::initializeGL() {
|
void QtkWidget::initializeGL() {
|
||||||
initializeOpenGLFunctions();
|
initializeOpenGLFunctions();
|
||||||
// Connect the frameSwapped signal to call the update() function
|
// Connect the frameSwapped signal to call the update() function
|
||||||
|
@ -113,10 +112,58 @@ void QtkWidget::paintGL() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtkWidget::setScene(Qtk::Scene * scene) {
|
||||||
|
delete mScene;
|
||||||
|
mScene = scene;
|
||||||
|
if(mScene != Q_NULLPTR) {
|
||||||
|
mConsole->setTitle(mScene->getSceneName());
|
||||||
|
} else {
|
||||||
|
mConsole->setTitle("Null Scene");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtkWidget::toggleConsole() {
|
||||||
|
if(mConsoleActive) {
|
||||||
|
mConsole->setHidden(true);
|
||||||
|
mConsoleActive = false;
|
||||||
|
} else {
|
||||||
|
MainWindow::getMainWindow()->addDockWidget(
|
||||||
|
Qt::DockWidgetArea::BottomDockWidgetArea,
|
||||||
|
dynamic_cast<QDockWidget *>(mConsole));
|
||||||
|
mConsole->setHidden(false);
|
||||||
|
mConsoleActive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Protected Slots
|
* Protected Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
void QtkWidget::keyPressEvent(QKeyEvent * event) {
|
||||||
|
if(event->isAutoRepeat()) {
|
||||||
|
// Do not repeat input while a key is held down
|
||||||
|
event->ignore();
|
||||||
|
} else {
|
||||||
|
Input::registerKeyPress(event->key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtkWidget::keyReleaseEvent(QKeyEvent * event) {
|
||||||
|
if(event->isAutoRepeat()) {
|
||||||
|
event->ignore();
|
||||||
|
} else {
|
||||||
|
Input::registerKeyRelease(event->key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtkWidget::mousePressEvent(QMouseEvent * event) {
|
||||||
|
Input::registerMousePress(event->button());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtkWidget::mouseReleaseEvent(QMouseEvent * event) {
|
||||||
|
Input::registerMouseRelease(event->button());
|
||||||
|
}
|
||||||
|
|
||||||
void QtkWidget::update() {
|
void QtkWidget::update() {
|
||||||
updateCameraInput();
|
updateCameraInput();
|
||||||
|
|
||||||
|
@ -195,39 +242,49 @@ void QtkWidget::messageLogged(const QOpenGLDebugMessage & msg) {
|
||||||
sendLog("(OpenGL) " + error.replace("\n", "\n(OpenGL) "), context);
|
sendLog("(OpenGL) " + error.replace("\n", "\n(OpenGL) "), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Protected Methods
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void QtkWidget::keyPressEvent(QKeyEvent * event) {
|
|
||||||
if(event->isAutoRepeat()) {
|
|
||||||
// Do not repeat input while a key is held down
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
Input::registerKeyPress(event->key());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtkWidget::keyReleaseEvent(QKeyEvent * event) {
|
|
||||||
if(event->isAutoRepeat()) {
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
Input::registerKeyRelease(event->key());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtkWidget::mousePressEvent(QMouseEvent * event) {
|
|
||||||
Input::registerMousePress(event->button());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtkWidget::mouseReleaseEvent(QMouseEvent * event) {
|
|
||||||
Input::registerMouseRelease(event->button());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Private Methods
|
* Private Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
void QtkWidget::teardownGL() { /* Nothing to teardown yet... */ }
|
||||||
|
|
||||||
|
void QtkWidget::updateCameraInput() {
|
||||||
|
Input::update();
|
||||||
|
// Camera Transformation
|
||||||
|
if(Input::buttonPressed(Qt::RightButton)) {
|
||||||
|
static const float transSpeed = 0.1f;
|
||||||
|
static const float rotSpeed = 0.5f;
|
||||||
|
|
||||||
|
// Handle rotations
|
||||||
|
Scene::getCamera().getTransform().rotate(
|
||||||
|
-rotSpeed * Input::mouseDelta().x(), Camera3D::LocalUp);
|
||||||
|
Scene::getCamera().getTransform().rotate(
|
||||||
|
-rotSpeed * Input::mouseDelta().y(), Scene::getCamera().getRight());
|
||||||
|
|
||||||
|
// Handle translations
|
||||||
|
QVector3D translation;
|
||||||
|
if(Input::keyPressed(Qt::Key_W)) {
|
||||||
|
translation += Scene::getCamera().getForward();
|
||||||
|
}
|
||||||
|
if(Input::keyPressed(Qt::Key_S)) {
|
||||||
|
translation -= Scene::getCamera().getForward();
|
||||||
|
}
|
||||||
|
if(Input::keyPressed(Qt::Key_A)) {
|
||||||
|
translation -= Scene::getCamera().getRight();
|
||||||
|
}
|
||||||
|
if(Input::keyPressed(Qt::Key_D)) {
|
||||||
|
translation += Scene::getCamera().getRight();
|
||||||
|
}
|
||||||
|
if(Input::keyPressed(Qt::Key_Q)) {
|
||||||
|
translation -= Scene::getCamera().getUp() / 2.0f;
|
||||||
|
}
|
||||||
|
if(Input::keyPressed(Qt::Key_E)) {
|
||||||
|
translation += Scene::getCamera().getUp() / 2.0f;
|
||||||
|
}
|
||||||
|
Scene::getCamera().getTransform().translate(transSpeed * translation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QtkWidget::printContextInformation() {
|
void QtkWidget::printContextInformation() {
|
||||||
QString glType;
|
QString glType;
|
||||||
QString glVersion;
|
QString glVersion;
|
||||||
|
@ -260,63 +317,3 @@ void QtkWidget::printContextInformation() {
|
||||||
qDebug() << qPrintable(message);
|
qDebug() << qPrintable(message);
|
||||||
sendLog("(OpenGL) " + message.replace("\n", "\n(OpenGL) "), Status);
|
sendLog("(OpenGL) " + message.replace("\n", "\n(OpenGL) "), Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtkWidget::updateCameraInput() {
|
|
||||||
Input::update();
|
|
||||||
// Camera Transformation
|
|
||||||
if(Input::buttonPressed(Qt::RightButton)) {
|
|
||||||
static const float transSpeed = 0.1f;
|
|
||||||
static const float rotSpeed = 0.5f;
|
|
||||||
|
|
||||||
// Handle rotations
|
|
||||||
Scene::getCamera().getTransform().rotate(
|
|
||||||
-rotSpeed * Input::mouseDelta().x(), Camera3D::LocalUp);
|
|
||||||
Scene::getCamera().getTransform().rotate(
|
|
||||||
-rotSpeed * Input::mouseDelta().y(), Scene::getCamera().right());
|
|
||||||
|
|
||||||
// Handle translations
|
|
||||||
QVector3D translation;
|
|
||||||
if(Input::keyPressed(Qt::Key_W)) {
|
|
||||||
translation += Scene::getCamera().forward();
|
|
||||||
}
|
|
||||||
if(Input::keyPressed(Qt::Key_S)) {
|
|
||||||
translation -= Scene::getCamera().forward();
|
|
||||||
}
|
|
||||||
if(Input::keyPressed(Qt::Key_A)) {
|
|
||||||
translation -= Scene::getCamera().right();
|
|
||||||
}
|
|
||||||
if(Input::keyPressed(Qt::Key_D)) {
|
|
||||||
translation += Scene::getCamera().right();
|
|
||||||
}
|
|
||||||
if(Input::keyPressed(Qt::Key_Q)) {
|
|
||||||
translation -= Scene::getCamera().up() / 2.0f;
|
|
||||||
}
|
|
||||||
if(Input::keyPressed(Qt::Key_E)) {
|
|
||||||
translation += Scene::getCamera().up() / 2.0f;
|
|
||||||
}
|
|
||||||
Scene::getCamera().getTransform().translate(transSpeed * translation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtkWidget::toggleConsole() {
|
|
||||||
if(mConsoleActive) {
|
|
||||||
mConsole->setHidden(true);
|
|
||||||
mConsoleActive = false;
|
|
||||||
} else {
|
|
||||||
MainWindow::getMainWindow()->addDockWidget(
|
|
||||||
Qt::DockWidgetArea::BottomDockWidgetArea,
|
|
||||||
dynamic_cast<QDockWidget *>(mConsole));
|
|
||||||
mConsole->setHidden(false);
|
|
||||||
mConsoleActive = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QtkWidget::setScene(Qtk::Scene * scene) {
|
|
||||||
delete mScene;
|
|
||||||
mScene = scene;
|
|
||||||
if(mScene != Q_NULLPTR) {
|
|
||||||
mConsole->setTitle(mScene->getSceneName());
|
|
||||||
} else {
|
|
||||||
mConsole->setTitle("Null Scene");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Main window for Qt6 OpenGL widget application ##
|
## About: QtkWidget for Qt desktop application ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
@ -17,8 +17,8 @@
|
||||||
#include <QOpenGLWidget>
|
#include <QOpenGLWidget>
|
||||||
#include <QPlainTextEdit>
|
#include <QPlainTextEdit>
|
||||||
|
|
||||||
#include "qtk/qtkapi.h"
|
#include <qtk/qtkapi.h>
|
||||||
#include "qtk/scene.h"
|
#include <qtk/scene.h>
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
class DebugConsole;
|
class DebugConsole;
|
||||||
|
@ -42,8 +42,7 @@ namespace Qtk {
|
||||||
*
|
*
|
||||||
* @param parent Pointer to a parent widget for this QtkWidget or nullptr.
|
* @param parent Pointer to a parent widget for this QtkWidget or nullptr.
|
||||||
*/
|
*/
|
||||||
explicit QtkWidget(QWidget * parent = nullptr) :
|
explicit QtkWidget(QWidget * parent = nullptr);
|
||||||
QtkWidget(parent, "QtkWidget") {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default construct a QtkWidget.
|
* Default construct a QtkWidget.
|
||||||
|
@ -62,26 +61,18 @@ namespace Qtk {
|
||||||
*/
|
*/
|
||||||
QtkWidget(QWidget * parent, const QString & name, Qtk::Scene * scene);
|
QtkWidget(QWidget * parent, const QString & name, Qtk::Scene * scene);
|
||||||
|
|
||||||
~QtkWidget() override;
|
~QtkWidget();
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Public Methods
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a QAction to hide / show this DebugConsole.
|
||||||
|
* @return QAction to toggle visibility of this DebugConsole.
|
||||||
|
*/
|
||||||
QAction * getActionToggleConsole();
|
QAction * getActionToggleConsole();
|
||||||
|
|
||||||
private:
|
|
||||||
/*************************************************************************
|
|
||||||
* Private Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
void teardownGL() { /* Nothing to teardown yet... */ }
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
public:
|
|
||||||
/*************************************************************************
|
|
||||||
* Public Inherited Virtual Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the widget is first constructed.
|
* Called when the widget is first constructed.
|
||||||
*/
|
*/
|
||||||
|
@ -104,24 +95,61 @@ namespace Qtk {
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The active scene being viewed in this widget.
|
||||||
|
*/
|
||||||
inline Qtk::Scene * getScene() { return mScene; }
|
inline Qtk::Scene * getScene() { return mScene; }
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param scene The new scene to view.
|
||||||
|
*/
|
||||||
void setScene(Qtk::Scene * scene);
|
void setScene(Qtk::Scene * scene);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle visibility of the DebugConsole associated with this QtkWidget.
|
* Toggle visibility of the DebugConsole associated with this QtkWidget.
|
||||||
*/
|
*/
|
||||||
void toggleConsole();
|
void toggleConsole();
|
||||||
|
|
||||||
protected slots:
|
signals:
|
||||||
|
/**
|
||||||
|
* Log a message to the DebugConsole associated with this widget.
|
||||||
|
* @param message The message to log.
|
||||||
|
* @param context The context of the log message.
|
||||||
|
*/
|
||||||
|
void sendLog(const QString & message, DebugContext context = Status);
|
||||||
|
|
||||||
|
protected:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Qt Slots
|
* Protected Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event Key press event to update camera input manager.
|
||||||
|
*/
|
||||||
|
void keyPressEvent(QKeyEvent * event) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event Key release event to update camera input manager.
|
||||||
|
*/
|
||||||
|
void keyReleaseEvent(QKeyEvent * event) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event Mouse button press event to update camera input manager.
|
||||||
|
*/
|
||||||
|
void mousePressEvent(QMouseEvent * event) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event Mouse button release event to update camera input manager.
|
||||||
|
*/
|
||||||
|
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||||
|
|
||||||
|
protected slots:
|
||||||
/**
|
/**
|
||||||
* Called when the `frameSwapped` signal is caught.
|
* Called when the `frameSwapped` signal is caught.
|
||||||
* See definition of initializeGL()
|
* See definition of initializeGL()
|
||||||
|
@ -137,39 +165,39 @@ namespace Qtk {
|
||||||
*/
|
*/
|
||||||
void messageLogged(const QOpenGLDebugMessage & msg);
|
void messageLogged(const QOpenGLDebugMessage & msg);
|
||||||
#endif
|
#endif
|
||||||
public:
|
|
||||||
signals:
|
|
||||||
void sendLog(
|
|
||||||
const QString & message, Qtk::DebugContext context = Qtk::Status);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/*************************************************************************
|
|
||||||
* Protected Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent * event) override;
|
|
||||||
void keyReleaseEvent(QKeyEvent * event) override;
|
|
||||||
void mousePressEvent(QMouseEvent * event) override;
|
|
||||||
void mouseReleaseEvent(QMouseEvent * event) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Methods
|
* Private Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deconstruct any resources we have allocated for this widget.
|
||||||
|
*/
|
||||||
|
void teardownGL();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function to update input for camera controls
|
||||||
|
*/
|
||||||
static void updateCameraInput();
|
static void updateCameraInput();
|
||||||
|
|
||||||
#ifdef QTK_DEBUG
|
#ifdef QTK_DEBUG
|
||||||
|
/**
|
||||||
|
* Prints OpenGL context information at start of debug session.
|
||||||
|
*/
|
||||||
void printContextInformation();
|
void printContextInformation();
|
||||||
QOpenGLDebugLogger * mDebugLogger;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
bool mConsoleActive = false;
|
#ifdef QTK_DEBUG
|
||||||
|
QOpenGLDebugLogger * mDebugLogger;
|
||||||
|
#endif
|
||||||
Qtk::Scene * mScene;
|
Qtk::Scene * mScene;
|
||||||
Qtk::DebugConsole * mConsole;
|
Qtk::DebugConsole * mConsole;
|
||||||
|
bool mConsoleActive = false;
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Toolbox plugin for object details and options ##
|
## About: Toolbox plugin for object details and options ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Toolbox plugin for object details and options ##
|
## About: Toolbox plugin for object details and options ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -22,10 +22,20 @@ namespace Qtk {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/*************************************************************************
|
||||||
|
* Contructors / Destructors
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
explicit ToolBox(QWidget * parent = nullptr);
|
explicit ToolBox(QWidget * parent = nullptr);
|
||||||
|
|
||||||
~ToolBox();
|
~ToolBox();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Private Members
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
Ui::ToolBox * ui;
|
Ui::ToolBox * ui;
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: TreeView plugin for scene hierarchy ##
|
## About: TreeView plugin for scene hierarchy ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -28,8 +28,9 @@ Qtk::TreeView::~TreeView() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Public Members
|
* Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void Qtk::TreeView::updateView(const Qtk::Scene * scene) {
|
void Qtk::TreeView::updateView(const Qtk::Scene * scene) {
|
||||||
ui->treeWidget->clear();
|
ui->treeWidget->clear();
|
||||||
ui->treeWidget->setColumnCount(1);
|
ui->treeWidget->setColumnCount(1);
|
||||||
|
@ -48,9 +49,9 @@ void Qtk::TreeView::itemFocus(QTreeWidgetItem * item, int column) {
|
||||||
auto & transform = scene->getCamera().getTransform();
|
auto & transform = scene->getCamera().getTransform();
|
||||||
auto object = scene->getObject(name);
|
auto object = scene->getObject(name);
|
||||||
Transform3D * objectTransform;
|
Transform3D * objectTransform;
|
||||||
if(object->getType() == Object::MESH) {
|
if(object->getType() == Object::QTK_MESH) {
|
||||||
objectTransform = &dynamic_cast<MeshRenderer *>(object)->getTransform();
|
objectTransform = &dynamic_cast<MeshRenderer *>(object)->getTransform();
|
||||||
} else if(object->getType() == Object::MODEL) {
|
} else if(object->getType() == Object::QTK_MODEL) {
|
||||||
objectTransform = &dynamic_cast<Model *>(object)->getTransform();
|
objectTransform = &dynamic_cast<Model *>(object)->getTransform();
|
||||||
}
|
}
|
||||||
transform.setTranslation(objectTransform->getTranslation());
|
transform.setTranslation(objectTransform->getTranslation());
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: TreeView plugin for scene hierarchy ##
|
## About: TreeView plugin for scene hierarchy ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -26,10 +26,18 @@ namespace Qtk {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/*************************************************************************
|
||||||
|
* Constructors / Destructors
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
explicit TreeView(QWidget * parent = nullptr);
|
explicit TreeView(QWidget * parent = nullptr);
|
||||||
|
|
||||||
~TreeView();
|
~TreeView();
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the QTreeWidget with all objects within the scene.
|
* Updates the QTreeWidget with all objects within the scene.
|
||||||
* @param scene The scene to load objects from.
|
* @param scene The scene to load objects from.
|
||||||
|
@ -48,6 +56,10 @@ namespace Qtk {
|
||||||
void itemFocus(QTreeWidgetItem * item, int column);
|
void itemFocus(QTreeWidgetItem * item, int column);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/*************************************************************************
|
||||||
|
* Private Members
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
Ui::TreeView * ui;
|
Ui::TreeView * ui;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Generic Qt Designer widget plugin ##
|
## About: Generic Qt Designer widget plugin ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -11,10 +11,14 @@
|
||||||
#include <QtPlugin>
|
#include <QtPlugin>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "qtk/qtkapi.h"
|
#include <qtk/qtkapi.h>
|
||||||
|
|
||||||
#include "widgetplugin.h"
|
#include "widgetplugin.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Constructors, Destructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
WidgetPlugin::WidgetPlugin(
|
WidgetPlugin::WidgetPlugin(
|
||||||
QString group, QString class_name, QString include,
|
QString group, QString class_name, QString include,
|
||||||
WidgetPlugin::Factory factory) :
|
WidgetPlugin::Factory factory) :
|
||||||
|
@ -22,21 +26,11 @@ WidgetPlugin::WidgetPlugin(
|
||||||
m_className(std::move(class_name)), m_includeFile(std::move(include)),
|
m_className(std::move(class_name)), m_includeFile(std::move(include)),
|
||||||
m_factory(std::move(factory)), m_objectName(class_name) {}
|
m_factory(std::move(factory)), m_objectName(class_name) {}
|
||||||
|
|
||||||
QString WidgetPlugin::toolTip() const {
|
WidgetPlugin::WidgetPlugin(QObject * parent) : QObject(parent) {}
|
||||||
return QStringLiteral("A custom widget tool tip.");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString WidgetPlugin::whatsThis() const {
|
/*******************************************************************************
|
||||||
return QStringLiteral("Custom widget what's this?");
|
* Public Methods
|
||||||
}
|
******************************************************************************/
|
||||||
|
|
||||||
QIcon WidgetPlugin::icon() const {
|
|
||||||
return Qtk::getIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WidgetPlugin::isContainer() const {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString WidgetPlugin::group() const {
|
QString WidgetPlugin::group() const {
|
||||||
return m_group;
|
return m_group;
|
||||||
|
@ -54,6 +48,22 @@ QWidget * WidgetPlugin::createWidget(QWidget * parent) {
|
||||||
return m_factory(parent);
|
return m_factory(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString WidgetPlugin::toolTip() const {
|
||||||
|
return QStringLiteral("A custom widget tool tip.");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString WidgetPlugin::whatsThis() const {
|
||||||
|
return QStringLiteral("Custom widget what's this?");
|
||||||
|
}
|
||||||
|
|
||||||
|
QIcon WidgetPlugin::icon() const {
|
||||||
|
return Qtk::getIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WidgetPlugin::isContainer() const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool WidgetPlugin::isInitialized() const {
|
bool WidgetPlugin::isInitialized() const {
|
||||||
return m_initialized;
|
return m_initialized;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Generic Qt Designer widget plugin ##
|
## About: Generic Qt Designer widget plugin ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -22,14 +22,21 @@ class QDESIGNER_WIDGET_EXPORT WidgetPlugin :
|
||||||
using Factory = std::function<QWidget *(QWidget *)>;
|
using Factory = std::function<QWidget *(QWidget *)>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/***************************************************************************
|
||||||
|
* Contructors / Destructors
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
WidgetPlugin(
|
WidgetPlugin(
|
||||||
QString group, QString class_name, QString include, Factory factory);
|
QString group, QString class_name, QString include, Factory factory);
|
||||||
|
|
||||||
explicit WidgetPlugin(QObject * parent = nullptr) : QObject(parent) {}
|
explicit WidgetPlugin(QObject * parent = nullptr);
|
||||||
|
|
||||||
~WidgetPlugin() = default;
|
~WidgetPlugin() = default;
|
||||||
|
|
||||||
public:
|
/***************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The name of the group to which this widget belongs.
|
* @return The name of the group to which this widget belongs.
|
||||||
*/
|
*/
|
||||||
|
@ -56,7 +63,7 @@ class QDESIGNER_WIDGET_EXPORT WidgetPlugin :
|
||||||
* @param parent Parent widget to the new instance of this widget.
|
* @param parent Parent widget to the new instance of this widget.
|
||||||
* @return A new instance of this custom widget.
|
* @return A new instance of this custom widget.
|
||||||
*/
|
*/
|
||||||
QWidget * createWidget(QWidget * parent) override;
|
[[nodiscard]] QWidget * createWidget(QWidget * parent) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Short description used in Qt Designer tool tips.
|
* @return Short description used in Qt Designer tool tips.
|
||||||
|
@ -102,8 +109,11 @@ class QDESIGNER_WIDGET_EXPORT WidgetPlugin :
|
||||||
[[nodiscard]] QString domXml() const override;
|
[[nodiscard]] QString domXml() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_initialized = false;
|
/***************************************************************************
|
||||||
|
* Private Members
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
bool m_initialized = false;
|
||||||
QString m_group;
|
QString m_group;
|
||||||
QString m_className;
|
QString m_className;
|
||||||
QString m_objectName;
|
QString m_objectName;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Collection of widget plugins for Qt Designer ##
|
## About: Collection of widget plugins for Qt Designer ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -14,6 +14,10 @@
|
||||||
#include "treeview.h"
|
#include "treeview.h"
|
||||||
#include "widgetplugin.h"
|
#include "widgetplugin.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Constructors, Destructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
WidgetPluginCollection::WidgetPluginCollection(QObject * parent) :
|
WidgetPluginCollection::WidgetPluginCollection(QObject * parent) :
|
||||||
QObject(parent), m_collectionName("Qtk Widget Collection") {
|
QObject(parent), m_collectionName("Qtk Widget Collection") {
|
||||||
m_collection = {
|
m_collection = {
|
||||||
|
@ -28,6 +32,11 @@ WidgetPluginCollection::WidgetPluginCollection(QObject * parent) :
|
||||||
[](QWidget * parent) { return new Qtk::ToolBox(parent); }),
|
[](QWidget * parent) { return new Qtk::ToolBox(parent); }),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
QList<QDesignerCustomWidgetInterface *> WidgetPluginCollection::customWidgets()
|
QList<QDesignerCustomWidgetInterface *> WidgetPluginCollection::customWidgets()
|
||||||
const {
|
const {
|
||||||
return m_collection;
|
return m_collection;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Collection of widget plugins for Qt Designer ##
|
## About: Collection of widget plugins for Qt Designer ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -17,16 +17,32 @@ class WidgetPluginCollection :
|
||||||
public QDesignerCustomWidgetCollectionInterface {
|
public QDesignerCustomWidgetCollectionInterface {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
// Since we're exporting a collection, this is the only plugin metadata
|
// Since we're exporting a collection, this is the only plugin metadata
|
||||||
// needed.
|
// needed. We don't need this for-each widget in the collection.
|
||||||
Q_PLUGIN_METADATA(IID "com.Klips.WidgetPluginCollection")
|
Q_PLUGIN_METADATA(IID "com.Klips.WidgetPluginCollection")
|
||||||
// Tell Qt Object system that we're implementing an interface.
|
// Tell Qt Object system that we're implementing an interface.
|
||||||
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
|
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/***************************************************************************
|
||||||
|
* Contructors / Destructors
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
explicit WidgetPluginCollection(QObject * parent = nullptr);
|
explicit WidgetPluginCollection(QObject * parent = nullptr);
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return QList of all custom widgets pointers.
|
||||||
|
*/
|
||||||
[[nodiscard]] QList<QDesignerCustomWidgetInterface *> customWidgets() const;
|
[[nodiscard]] QList<QDesignerCustomWidgetInterface *> customWidgets() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/***************************************************************************
|
||||||
|
* Private Members
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
QList<QDesignerCustomWidgetInterface *> m_collection;
|
QList<QDesignerCustomWidgetInterface *> m_collection;
|
||||||
QString m_collectionName;
|
QString m_collectionName;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
|
||||||
## ##
|
|
||||||
## Project for working with OpenGL and Qt6 widgets ##
|
## Project for working with OpenGL and Qt6 widgets ##
|
||||||
|
## ##
|
||||||
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
|
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
# TODO: Provide option for linking MainWindow with plugin statically
|
# TODO: Provide option for linking MainWindow with plugin statically
|
||||||
|
@ -16,9 +17,10 @@
|
||||||
set(PUBLIC_HEADERS
|
set(PUBLIC_HEADERS
|
||||||
camera3d.h
|
camera3d.h
|
||||||
input.h
|
input.h
|
||||||
mesh.h
|
shape.h
|
||||||
meshrenderer.h
|
meshrenderer.h
|
||||||
model.h
|
model.h
|
||||||
|
modelmesh.h
|
||||||
object.h
|
object.h
|
||||||
qtkapi.h
|
qtkapi.h
|
||||||
scene.h
|
scene.h
|
||||||
|
@ -30,9 +32,10 @@ set(PUBLIC_HEADERS
|
||||||
set(SOURCE_FILES
|
set(SOURCE_FILES
|
||||||
camera3d.cpp
|
camera3d.cpp
|
||||||
input.cpp
|
input.cpp
|
||||||
mesh.cpp
|
shape.cpp
|
||||||
meshrenderer.cpp
|
meshrenderer.cpp
|
||||||
model.cpp
|
model.cpp
|
||||||
|
modelmesh.cpp
|
||||||
object.cpp
|
object.cpp
|
||||||
scene.cpp
|
scene.cpp
|
||||||
skybox.cpp
|
skybox.cpp
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Fly camera class from tutorials followed at trentreed.net ##
|
## About: Fly camera class from tutorials followed at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -10,15 +10,18 @@
|
||||||
|
|
||||||
using namespace Qtk;
|
using namespace Qtk;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Static Public Constants
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
const QVector3D Camera3D::LocalForward(0.0f, 0.0f, -1.0f);
|
const QVector3D Camera3D::LocalForward(0.0f, 0.0f, -1.0f);
|
||||||
const QVector3D Camera3D::LocalUp(0.0f, 1.0f, 0.0f);
|
const QVector3D Camera3D::LocalUp(0.0f, 1.0f, 0.0f);
|
||||||
const QVector3D Camera3D::LocalRight(1.0f, 0.0f, 0.0f);
|
const QVector3D Camera3D::LocalRight(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Accessors
|
* Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
// Produces worldToView matrix
|
|
||||||
const QMatrix4x4 & Camera3D::toMatrix() {
|
const QMatrix4x4 & Camera3D::toMatrix() {
|
||||||
mWorld.setToIdentity();
|
mWorld.setToIdentity();
|
||||||
// Qt6 renamed QMatrix4x4::conjugate() to conjugated()
|
// Qt6 renamed QMatrix4x4::conjugate() to conjugated()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Fly camera class from tutorials followed at trentreed.net ##
|
## About: Fly camera class from tutorials followed at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -18,7 +18,7 @@ namespace Qtk {
|
||||||
class QTKAPI Camera3D {
|
class QTKAPI Camera3D {
|
||||||
public:
|
public:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Constants
|
* Static Public Constants
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
static const QVector3D LocalForward;
|
static const QVector3D LocalForward;
|
||||||
|
@ -29,39 +29,56 @@ namespace Qtk {
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Transform3D associated with this camera.
|
||||||
|
*/
|
||||||
inline Transform3D & getTransform() { return mTransform; }
|
inline Transform3D & getTransform() { return mTransform; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Current translation of the camera as a QVector3D.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const QVector3D & getTranslation() const {
|
[[nodiscard]] inline const QVector3D & getTranslation() const {
|
||||||
return mTransform.getTranslation();
|
return mTransform.getTranslation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Current rotation of this camera as a QQuaternion.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const QQuaternion & getRotation() const {
|
[[nodiscard]] inline const QQuaternion & getRotation() const {
|
||||||
return mTransform.getRotation();
|
return mTransform.getRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
const QMatrix4x4 & toMatrix();
|
/**
|
||||||
|
* @return QVector3D for the forward vector of the camera.
|
||||||
// Queries
|
*/
|
||||||
[[nodiscard]] inline QVector3D forward() const {
|
[[nodiscard]] inline QVector3D getForward() const {
|
||||||
return mTransform.getRotation().rotatedVector(LocalForward);
|
return mTransform.getRotation().rotatedVector(LocalForward);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline QVector3D right() const {
|
/**
|
||||||
|
* @return QVector3D for the right vector of the camera.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] inline QVector3D getRight() const {
|
||||||
return mTransform.getRotation().rotatedVector(LocalRight);
|
return mTransform.getRotation().rotatedVector(LocalRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline QVector3D up() const {
|
/**
|
||||||
|
* @return QVector3D for the up vector of the camera.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] inline QVector3D getUp() const {
|
||||||
return mTransform.getRotation().rotatedVector(LocalUp);
|
return mTransform.getRotation().rotatedVector(LocalUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Members
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
Transform3D mTransform;
|
/**
|
||||||
QMatrix4x4 mWorld;
|
* @return World To View matrix for this camera.
|
||||||
|
*/
|
||||||
|
const QMatrix4x4 & toMatrix();
|
||||||
|
|
||||||
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Methods
|
* Private Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
@ -70,6 +87,13 @@ namespace Qtk {
|
||||||
friend QDataStream & operator<<(QDataStream & out, Camera3D & transform);
|
friend QDataStream & operator<<(QDataStream & out, Camera3D & transform);
|
||||||
friend QDataStream & operator>>(QDataStream & in, Camera3D & transform);
|
friend QDataStream & operator>>(QDataStream & in, Camera3D & transform);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Private Members
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
Transform3D mTransform;
|
||||||
|
QMatrix4x4 mWorld;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Qt Streams
|
// Qt Streams
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Input class from tutorials followed at trentreed.net ##
|
## About: Input class from tutorials followed at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -18,6 +18,13 @@ using namespace Qtk;
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Static Helper Structs
|
* Static Helper Structs
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct to hold key input state. When a key is pressed we construct this and
|
||||||
|
* store it within a KeyContainer (or ButtonContainer for mouse buttons).
|
||||||
|
*
|
||||||
|
* @tparam T Qt::Key or Qt::MouseButton input type for this instance.
|
||||||
|
*/
|
||||||
template <typename T> struct InputInstance : std::pair<T, Input::InputState> {
|
template <typename T> struct InputInstance : std::pair<T, Input::InputState> {
|
||||||
typedef std::pair<T, Input::InputState> base_class;
|
typedef std::pair<T, Input::InputState> base_class;
|
||||||
|
|
||||||
|
@ -28,6 +35,7 @@ template <typename T> struct InputInstance : std::pair<T, Input::InputState> {
|
||||||
inline InputInstance(T value, Input::InputState state) :
|
inline InputInstance(T value, Input::InputState state) :
|
||||||
base_class(value, state) {}
|
base_class(value, state) {}
|
||||||
|
|
||||||
|
// Allows use of std::find to search for a key's InputInstance
|
||||||
inline bool operator==(const InputInstance & rhs) const {
|
inline bool operator==(const InputInstance & rhs) const {
|
||||||
return this->first == rhs.first;
|
return this->first == rhs.first;
|
||||||
}
|
}
|
||||||
|
@ -53,14 +61,44 @@ static QPoint sg_mouseDelta;
|
||||||
* Static Inline Helper Functions
|
* Static Inline Helper Functions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for the InputInstance of a key.
|
||||||
|
*
|
||||||
|
* @param value The key to search for.
|
||||||
|
* @return Iterator to the found element or the end iterator if not found.
|
||||||
|
*/
|
||||||
static inline KeyContainer::iterator FindKey(Qt::Key value) {
|
static inline KeyContainer::iterator FindKey(Qt::Key value) {
|
||||||
return std::find(sg_keyInstances.begin(), sg_keyInstances.end(), value);
|
return std::find(sg_keyInstances.begin(), sg_keyInstances.end(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for the InputInstance of a mouse button.
|
||||||
|
*
|
||||||
|
* @param value The mouse button to search for.
|
||||||
|
* @return Iterator to the found element or the end iterator if not found.
|
||||||
|
*/
|
||||||
static inline ButtonContainer::iterator FindButton(Qt::MouseButton value) {
|
static inline ButtonContainer::iterator FindButton(Qt::MouseButton value) {
|
||||||
return std::find(sg_buttonInstances.begin(), sg_buttonInstances.end(), value);
|
return std::find(sg_buttonInstances.begin(), sg_buttonInstances.end(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check an InputInstance for the InputReleased state.
|
||||||
|
*
|
||||||
|
* @tparam TPair KeyInstance or ButtonInstance
|
||||||
|
* @param instance Instance to check for InputReleased state.
|
||||||
|
* @return True if the InputInstance is in the released state.
|
||||||
|
*/
|
||||||
|
template <typename TPair>
|
||||||
|
static inline bool CheckReleased(const TPair & instance) {
|
||||||
|
return instance.second == Input::InputReleased;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an InputInstance and applies transitions if needed.
|
||||||
|
*
|
||||||
|
* @tparam TPair KeyInstance or ButtonInstance.
|
||||||
|
* @param instance The InputInstance to update.
|
||||||
|
*/
|
||||||
template <typename TPair> static inline void UpdateStates(TPair & instance) {
|
template <typename TPair> static inline void UpdateStates(TPair & instance) {
|
||||||
switch(instance.second) {
|
switch(instance.second) {
|
||||||
case Input::InputRegistered:
|
case Input::InputRegistered:
|
||||||
|
@ -77,11 +115,12 @@ template <typename TPair> static inline void UpdateStates(TPair & instance) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TPair>
|
/**
|
||||||
static inline bool CheckReleased(const TPair & instance) {
|
* Updates InputInstance containers to track input state.
|
||||||
return instance.second == Input::InputReleased;
|
*
|
||||||
}
|
* @tparam Container The type of container, KeyContainer or ButtonContainer.
|
||||||
|
* @param container The InputInstance container to update.
|
||||||
|
*/
|
||||||
template <typename Container> static inline void Update(Container & container) {
|
template <typename Container> static inline void Update(Container & container) {
|
||||||
typedef typename Container::iterator Iter;
|
typedef typename Container::iterator Iter;
|
||||||
typedef typename Container::value_type TPair;
|
typedef typename Container::value_type TPair;
|
||||||
|
@ -96,27 +135,9 @@ template <typename Container> static inline void Update(Container & container) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Input Implementation
|
* Static Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
Input::InputState Input::keyState(Qt::Key k) {
|
|
||||||
auto it = FindKey(k);
|
|
||||||
return (it != sg_keyInstances.end()) ? it->second : InputInvalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
Input::InputState Input::buttonState(Qt::MouseButton k) {
|
|
||||||
auto it = FindButton(k);
|
|
||||||
return (it != sg_buttonInstances.end()) ? it->second : InputInvalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPoint Input::mousePosition() {
|
|
||||||
return QCursor::pos();
|
|
||||||
}
|
|
||||||
|
|
||||||
QPoint Input::mouseDelta() {
|
|
||||||
return sg_mouseDelta;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Input::update() {
|
void Input::update() {
|
||||||
// Update Mouse Delta
|
// Update Mouse Delta
|
||||||
sg_mousePrevPosition = sg_mouseCurrPosition;
|
sg_mousePrevPosition = sg_mouseCurrPosition;
|
||||||
|
@ -160,3 +181,21 @@ void Input::reset() {
|
||||||
sg_keyInstances.clear();
|
sg_keyInstances.clear();
|
||||||
sg_buttonInstances.clear();
|
sg_buttonInstances.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Input::InputState Input::keyState(Qt::Key k) {
|
||||||
|
auto it = FindKey(k);
|
||||||
|
return (it != sg_keyInstances.end()) ? it->second : InputInvalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
Input::InputState Input::buttonState(Qt::MouseButton k) {
|
||||||
|
auto it = FindButton(k);
|
||||||
|
return (it != sg_buttonInstances.end()) ? it->second : InputInvalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint Input::mousePosition() {
|
||||||
|
return QCursor::pos();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint Input::mouseDelta() {
|
||||||
|
return sg_mouseDelta;
|
||||||
|
}
|
||||||
|
|
107
src/qtk/input.h
107
src/qtk/input.h
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Input class from tutorials followed at trentreed.net ##
|
## About: Input class from tutorials followed at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -22,60 +22,133 @@ namespace Qtk {
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possible key states
|
* Possible key states. See UpdateStates for state transitions.
|
||||||
|
*
|
||||||
|
* When a key is pressed we enter states Registered->Triggered->Pressed.
|
||||||
|
* InputTriggered state will be met only once if a key is pressed or held.
|
||||||
|
* While a key is held down the state is InputPressed.
|
||||||
|
*
|
||||||
|
* When a key is released we enter InputUnregistered->InputReleased
|
||||||
|
* When an active InputInstance for a key has this state it is removed.
|
||||||
*/
|
*/
|
||||||
enum InputState {
|
enum InputState {
|
||||||
InputInvalid,
|
InputInvalid,
|
||||||
InputRegistered,
|
InputRegistered, // Initial state. Transitions to InputTriggered
|
||||||
InputUnregistered,
|
InputUnregistered, // Transition to InputReleased
|
||||||
InputTriggered,
|
InputTriggered, // Transition to InputPressed
|
||||||
InputPressed,
|
InputPressed, // State of a key while it is held down.
|
||||||
InputReleased
|
InputReleased // Released keys are removed from state containers.
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Public Methods
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// State checking
|
//
|
||||||
|
// State updating.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update state for all mouse button and key instances.
|
||||||
|
*/
|
||||||
|
static void update();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key Key to set InputRegistered state.
|
||||||
|
*/
|
||||||
|
static void registerKeyPress(int key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key Key to set InputReleased state.
|
||||||
|
*/
|
||||||
|
static void registerKeyRelease(int key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button Mouse button to set InputRegistered state.
|
||||||
|
*/
|
||||||
|
static void registerMousePress(Qt::MouseButton button);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button Mouse button to set InputReleased state.
|
||||||
|
*/
|
||||||
|
static void registerMouseRelease(Qt::MouseButton button);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset input state for all key and mouse buttons.
|
||||||
|
*/
|
||||||
|
static void reset();
|
||||||
|
|
||||||
|
//
|
||||||
|
// State Checking.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key Key to check state.
|
||||||
|
* @return True if the key is in InputTriggered state.
|
||||||
|
*/
|
||||||
inline static bool keyTriggered(Qt::Key key) {
|
inline static bool keyTriggered(Qt::Key key) {
|
||||||
return keyState(key) == InputTriggered;
|
return keyState(key) == InputTriggered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key Key to check state.
|
||||||
|
* @return True if the key is in InputPressed state.
|
||||||
|
*/
|
||||||
inline static bool keyPressed(Qt::Key key) {
|
inline static bool keyPressed(Qt::Key key) {
|
||||||
return keyState(key) == InputPressed;
|
return keyState(key) == InputPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key Key to check state.
|
||||||
|
* @return True if the key is in InputReleased state.
|
||||||
|
*/
|
||||||
inline static bool keyReleased(Qt::Key key) {
|
inline static bool keyReleased(Qt::Key key) {
|
||||||
return keyState(key) == InputReleased;
|
return keyState(key) == InputReleased;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button Mouse button to check state.
|
||||||
|
* @return True if the key is in InputTriggered state.
|
||||||
|
*/
|
||||||
inline static bool buttonTriggered(Qt::MouseButton button) {
|
inline static bool buttonTriggered(Qt::MouseButton button) {
|
||||||
return buttonState(button) == InputTriggered;
|
return buttonState(button) == InputTriggered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button Mouse button to check state.
|
||||||
|
* @return True if the key is in InputPressed state.
|
||||||
|
*/
|
||||||
inline static bool buttonPressed(Qt::MouseButton button) {
|
inline static bool buttonPressed(Qt::MouseButton button) {
|
||||||
return buttonState(button) == InputPressed;
|
return buttonState(button) == InputPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button Mouse button to check state.
|
||||||
|
* @return True if the key is in InputReleased state.
|
||||||
|
*/
|
||||||
inline static bool buttonReleased(Qt::MouseButton button) {
|
inline static bool buttonReleased(Qt::MouseButton button) {
|
||||||
return buttonState(button) == InputReleased;
|
return buttonState(button) == InputReleased;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implementation
|
/**
|
||||||
|
* @param key The key to check InputState.
|
||||||
|
* @return The current InputState for the given key.
|
||||||
|
*/
|
||||||
static InputState keyState(Qt::Key key);
|
static InputState keyState(Qt::Key key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param button The mouse button to check InputState.
|
||||||
|
* @return The current InputState for the mouse button.
|
||||||
|
*/
|
||||||
static InputState buttonState(Qt::MouseButton button);
|
static InputState buttonState(Qt::MouseButton button);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return QPoint representing the mouse position within the widget.
|
||||||
|
*/
|
||||||
static QPoint mousePosition();
|
static QPoint mousePosition();
|
||||||
static QPoint mouseDelta();
|
|
||||||
|
|
||||||
// State updating
|
/**
|
||||||
static void update();
|
* @return Delta movement of mouse from previous to current position.
|
||||||
static void registerKeyPress(int key);
|
*/
|
||||||
static void registerKeyRelease(int key);
|
static QPoint mouseDelta();
|
||||||
static void registerMousePress(Qt::MouseButton button);
|
|
||||||
static void registerMouseRelease(Qt::MouseButton button);
|
|
||||||
static void reset();
|
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: MeshRenderer class for quick object creation and drawing ##
|
## About: MeshRenderer class for quick object creation and drawing ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -17,8 +17,20 @@ using namespace Qtk;
|
||||||
// Static QHash that holds all MeshRenderer instances using their mName as keys
|
// Static QHash that holds all MeshRenderer instances using their mName as keys
|
||||||
Qtk::MeshRenderer::MeshManager Qtk::MeshRenderer::sInstances;
|
Qtk::MeshRenderer::MeshManager Qtk::MeshRenderer::sInstances;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Constructors / Destructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
MeshRenderer::MeshRenderer(
|
||||||
|
const char * name, Vertices vertices, Indices indices, DrawMode mode) :
|
||||||
|
MeshRenderer(
|
||||||
|
name, ShapeBase(mode, std::move(vertices), std::move(indices))) {}
|
||||||
|
|
||||||
|
MeshRenderer::MeshRenderer(const char * name) :
|
||||||
|
MeshRenderer(name, Cube(QTK_DRAW_ELEMENTS)) {}
|
||||||
|
|
||||||
MeshRenderer::MeshRenderer(const char * name, const ShapeBase & shape) :
|
MeshRenderer::MeshRenderer(const char * name, const ShapeBase & shape) :
|
||||||
Object(name, shape, MESH), mVertexShader(":/multi-color.vert"),
|
Object(name, shape, QTK_MESH), mVertexShader(":/multi-color.vert"),
|
||||||
mFragmentShader(":/multi-color.frag"), mDrawType(GL_TRIANGLES) {
|
mFragmentShader(":/multi-color.frag"), mDrawType(GL_TRIANGLES) {
|
||||||
mShape = Shape(shape);
|
mShape = Shape(shape);
|
||||||
init();
|
init();
|
||||||
|
@ -29,20 +41,8 @@ MeshRenderer::~MeshRenderer() {
|
||||||
sInstances.remove(mName);
|
sInstances.remove(mName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Static member function to retrieve instances of MeshRenderers
|
|
||||||
MeshRenderer * MeshRenderer::getInstance(const QString & name) {
|
|
||||||
if(!sInstances.contains(name)) {
|
|
||||||
#if QTK_DEBUG
|
|
||||||
qDebug() << "Attempt to access MeshRenderer instance that does not exist! ("
|
|
||||||
<< qPrintable(name) << ")\n";
|
|
||||||
#endif
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return sInstances[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Public Member Functions
|
* Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void MeshRenderer::init() {
|
void MeshRenderer::init() {
|
||||||
|
@ -123,33 +123,11 @@ void MeshRenderer::draw() {
|
||||||
releaseShaders();
|
releaseShaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshRenderer::setShaders(
|
void MeshRenderer::enableAttributeArray(int location) {
|
||||||
const std::string & vert, const std::string & frag) {
|
|
||||||
mVertexShader = vert;
|
|
||||||
mFragmentShader = frag;
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshRenderer::setUniformMVP(
|
|
||||||
const char * model, const char * view, const char * projection) {
|
|
||||||
ShaderBindScope lock(&mProgram, mBound);
|
ShaderBindScope lock(&mProgram, mBound);
|
||||||
mProgram.setUniformValue(projection, Scene::getProjectionMatrix());
|
mVAO.bind();
|
||||||
mProgram.setUniformValue(view, Scene::getViewMatrix());
|
mProgram.enableAttributeArray(location);
|
||||||
mProgram.setUniformValue(model, mTransform.toMatrix());
|
mVAO.release();
|
||||||
}
|
|
||||||
|
|
||||||
void MeshRenderer::setColor(const QVector3D & color) {
|
|
||||||
if(mShape.mColors.empty()) {
|
|
||||||
for(const auto & vertex : mShape.getVertices()) {
|
|
||||||
mShape.mColors.push_back(color);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for(int i = 0; i < mShape.getColors().size(); i++) {
|
|
||||||
mShape.mColors[i] = color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// TODO: Factor this out so we don't need to reinitialize
|
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshRenderer::reallocateTexCoords(const TexCoords & t, unsigned dims) {
|
void MeshRenderer::reallocateTexCoords(const TexCoords & t, unsigned dims) {
|
||||||
|
@ -185,11 +163,60 @@ void MeshRenderer::reallocateNormals(const Normals & n, unsigned dims) {
|
||||||
mVAO.release();
|
mVAO.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
void MeshRenderer::setShaders(
|
||||||
* Inherited Virtual Member Functions
|
const std::string & vert, const std::string & frag) {
|
||||||
******************************************************************************/
|
mVertexShader = vert;
|
||||||
|
mFragmentShader = frag;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MeshRenderer::setUniformMVP(
|
||||||
|
const char * model, const char * view, const char * projection) {
|
||||||
|
ShaderBindScope lock(&mProgram, mBound);
|
||||||
|
mProgram.setUniformValue(projection, Scene::getProjectionMatrix());
|
||||||
|
mProgram.setUniformValue(view, Scene::getViewMatrix());
|
||||||
|
mProgram.setUniformValue(model, mTransform.toMatrix());
|
||||||
|
}
|
||||||
|
|
||||||
void MeshRenderer::setShape(const Shape & value) {
|
void MeshRenderer::setShape(const Shape & value) {
|
||||||
Object::setShape(value);
|
Object::setShape(value);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MeshRenderer::setColor(const QVector3D & color) {
|
||||||
|
if(mShape.mColors.empty()) {
|
||||||
|
for(const auto & vertex : mShape.getVertices()) {
|
||||||
|
mShape.mColors.push_back(color);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(int i = 0; i < mShape.getColors().size(); i++) {
|
||||||
|
mShape.mColors[i] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Factor this out so we don't need to reinitialize
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MeshRenderer::setAttributeBuffer(
|
||||||
|
int location, GLenum type, int offset, int tupleSize, int stride) {
|
||||||
|
ShaderBindScope lock(&mProgram, mBound);
|
||||||
|
mVAO.bind();
|
||||||
|
mProgram.setAttributeBuffer(location, type, offset, tupleSize, stride);
|
||||||
|
mVAO.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Static Public Methods
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
// Static member function to retrieve instances of MeshRenderers
|
||||||
|
MeshRenderer * MeshRenderer::getInstance(const QString & name) {
|
||||||
|
if(!sInstances.contains(name)) {
|
||||||
|
#if QTK_DEBUG
|
||||||
|
qDebug() << "Attempt to access MeshRenderer instance that does not exist! ("
|
||||||
|
<< qPrintable(name) << ")\n";
|
||||||
|
#endif
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return sInstances[name];
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: MeshRenderer class for quick object creation and drawing ##
|
## About: MeshRenderer class for quick object creation and drawing ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "mesh.h"
|
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
#include "qtkapi.h"
|
#include "qtkapi.h"
|
||||||
|
#include "shape.h"
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
class QTKAPI MeshRenderer : public Object {
|
class QTKAPI MeshRenderer : public Object {
|
||||||
|
@ -21,93 +21,179 @@ namespace Qtk {
|
||||||
* Typedefs
|
* Typedefs
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
/* Static QHash of all mesh objects within the scene. */
|
/** Static QHash of all mesh objects within the scene. */
|
||||||
typedef QHash<QString, MeshRenderer *> MeshManager;
|
typedef QHash<QString, MeshRenderer *> MeshManager;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Constructors / Destructors
|
* Constructors / Destructors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Delegate constructors
|
/**
|
||||||
|
* Delegate constructor.
|
||||||
|
* Constructs a MeshRenderer with custom vertices and indices for more
|
||||||
|
* complex geometry.
|
||||||
|
*
|
||||||
|
* @param name Name to use for the new QObject.
|
||||||
|
* @param vertices Vertices to use for initializing geometry shape.
|
||||||
|
* @param indices Indicess to use for initializes geometry shape.
|
||||||
|
* @param mode OpenGL draw mode. Supported modes are prefixed with QTK_*
|
||||||
|
*/
|
||||||
MeshRenderer(
|
MeshRenderer(
|
||||||
const char * name, Vertices vertices, Indices indices,
|
const char * name, Vertices vertices, Indices indices,
|
||||||
DrawMode mode = QTK_DRAW_ARRAYS) :
|
DrawMode mode = QTK_DRAW_ARRAYS);
|
||||||
MeshRenderer(
|
|
||||||
name, ShapeBase(mode, std::move(vertices), std::move(indices))) {}
|
|
||||||
|
|
||||||
explicit MeshRenderer(const char * name) :
|
/**
|
||||||
MeshRenderer(name, Cube(QTK_DRAW_ELEMENTS)) {}
|
* Delegate constructor.
|
||||||
|
* Constructs a MeshRenderer with a default shape of a cube.
|
||||||
|
*
|
||||||
|
* @param name Name to use for the new QObject.
|
||||||
|
*/
|
||||||
|
explicit MeshRenderer(const char * name);
|
||||||
|
|
||||||
// Constructor
|
/**
|
||||||
|
* Construct a MeshRenderer.
|
||||||
|
* Default shaders will be used unless subsequently set by the caller.
|
||||||
|
*
|
||||||
|
* @param name Name to use for the new QObject.
|
||||||
|
* @param shape The shape of the MeshRenderer.
|
||||||
|
* For models this can be set using ShapeBase ctors.
|
||||||
|
*/
|
||||||
MeshRenderer(const char * name, const ShapeBase & shape);
|
MeshRenderer(const char * name, const ShapeBase & shape);
|
||||||
~MeshRenderer() override;
|
|
||||||
|
~MeshRenderer();
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Public Methods
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes OpenGL buffers and settings for this MeshRenderer.
|
||||||
|
*/
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws this MeshRenderer.
|
||||||
|
*/
|
||||||
void draw();
|
void draw();
|
||||||
|
|
||||||
inline void enableAttributeArray(int location) {
|
/**
|
||||||
ShaderBindScope lock(&mProgram, mBound);
|
* Enables shader attribute array from the MeshRenderer's VAO.
|
||||||
mVAO.bind();
|
* @param location Index location of the attribute array to enable.
|
||||||
mProgram.enableAttributeArray(location);
|
*/
|
||||||
mVAO.release();
|
void enableAttributeArray(int location);
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reallocates texture coordinates to the mNBO member object.
|
||||||
|
*
|
||||||
|
* @param t Texture coordinates to reallocate.
|
||||||
|
* @param dims Number of dimensions to use for the coordinates.
|
||||||
|
*/
|
||||||
void reallocateTexCoords(const TexCoords & t, unsigned dims = 2);
|
void reallocateTexCoords(const TexCoords & t, unsigned dims = 2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reallocates normals to the mNBO member object.
|
||||||
|
*
|
||||||
|
* @param n Normal coordinate to reallocate.
|
||||||
|
* @param dims Number of dimensions to use for the coordinates.
|
||||||
|
*/
|
||||||
void reallocateNormals(const Normals & n, unsigned dims = 3);
|
void reallocateNormals(const Normals & n, unsigned dims = 3);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Draw types like GL_TRIANGLES, GL_POINTS, GL_LINES, etc
|
/**
|
||||||
void setDrawType(int drawType) { mDrawType = drawType; }
|
* Set OpenGL draw type. GL_TRIANGLES, GL_POINTS, GL_LINES, etc.
|
||||||
|
*
|
||||||
|
* @param drawType The draw type to use for this MeshRenderer.
|
||||||
|
*/
|
||||||
|
inline void setDrawType(int drawType) { mDrawType = drawType; }
|
||||||
|
|
||||||
// Shader settings
|
/**
|
||||||
|
* @param vert Path to vertex shader to use for this MeshRenderer.
|
||||||
|
*/
|
||||||
inline void setShaderVertex(const std::string & vert) {
|
inline void setShaderVertex(const std::string & vert) {
|
||||||
mVertexShader = vert;
|
mVertexShader = vert;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param frag Path to fragment shader to use for this MeshRenderer.
|
||||||
|
*/
|
||||||
inline void setShaderFragment(const std::string & frag) {
|
inline void setShaderFragment(const std::string & frag) {
|
||||||
mFragmentShader = frag;
|
mFragmentShader = frag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param vert Path to vertex shader to use for this MeshRenderer.
|
||||||
|
* @param frag Path to fragment shader to use for this MeshRenderer.
|
||||||
|
*/
|
||||||
void setShaders(const std::string & vert, const std::string & frag);
|
void setShaders(const std::string & vert, const std::string & frag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tparam T Type of the uniform value to set.
|
||||||
|
* @param location Index location of the uniform value we are setting.
|
||||||
|
* @param value The value to use for the uniform.
|
||||||
|
*/
|
||||||
template <typename T> inline void setUniform(int location, T value) {
|
template <typename T> inline void setUniform(int location, T value) {
|
||||||
ShaderBindScope lock(&mProgram, mBound);
|
ShaderBindScope lock(&mProgram, mBound);
|
||||||
mProgram.setUniformValue(location, value);
|
mProgram.setUniformValue(location, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tparam T Type of the uniform value to set.
|
||||||
|
* @param location Name of the uniform value we are setting.
|
||||||
|
* @param value The value to use for the uniform.
|
||||||
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void setUniform(const char * location, T value) {
|
inline void setUniform(const char * location, T value) {
|
||||||
ShaderBindScope lock(&mProgram, mBound);
|
ShaderBindScope lock(&mProgram, mBound);
|
||||||
mProgram.setUniformValue(location, value);
|
mProgram.setUniformValue(location, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set MVP matrix using this Object's transform
|
/**
|
||||||
// + View and projection provided by MainWidget static members
|
* Sets the MVP matrices for this object within the scene.
|
||||||
|
* Model matrix is provided by this model's transform.
|
||||||
|
* View and Projection matrices are provided by the scene.
|
||||||
|
*
|
||||||
|
* @param model Name of the uniform to store the Model matrix.
|
||||||
|
* @param view Name of the uniform to store the View matrix.
|
||||||
|
* @param projection Name of the uniform to store the Projection matrix.
|
||||||
|
*/
|
||||||
void setUniformMVP(
|
void setUniformMVP(
|
||||||
const char * model = "uModel", const char * view = "uView",
|
const char * model = "uModel", const char * view = "uView",
|
||||||
const char * projection = "uProjection");
|
const char * projection = "uProjection");
|
||||||
|
|
||||||
// These functions modify data stored in a VBO
|
/**
|
||||||
// + After calling them, the VBO will need to be reallocated
|
* Sets the shape of the MeshRenderer using the Object base class method.
|
||||||
|
* The MeshRenderer will be reinitialized after this call using `init()`.
|
||||||
|
*
|
||||||
|
* @param value Shape to use for this MeshRenderer.
|
||||||
|
*/
|
||||||
void setShape(const Shape & value) override;
|
void setShape(const Shape & value) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets all vertices in the mesh to a color.
|
||||||
|
* The MeshRenderer will be reinitialized after this call using `init()`.
|
||||||
|
*
|
||||||
|
* @param color The color to use for the entire mesh.
|
||||||
|
*/
|
||||||
void setColor(const QVector3D & color);
|
void setColor(const QVector3D & color);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an attribute buffer. This should be called whenever related
|
||||||
|
* buffers are reallocated. If the new buffer uses an identical format
|
||||||
|
* this may not be required.
|
||||||
|
*
|
||||||
|
* @param location Index location of the attribute buffer to set.
|
||||||
|
* @param type The type of the values within the attribute buffer.
|
||||||
|
* @param offset Offset to the beginning of the buffer.
|
||||||
|
* @param tupleSize Size of each group of elements in the buffer.
|
||||||
|
* For (x, y) positions this would be 2, (x, y, z) would be 3, etc.
|
||||||
|
* @param stride Stride between groups of elements in the buffer.
|
||||||
|
* For example (x, y) data stride is `2 * sizeof(type)`
|
||||||
|
*/
|
||||||
void setAttributeBuffer(
|
void setAttributeBuffer(
|
||||||
int location, GLenum type, int offset, int tupleSize,
|
int location, GLenum type, int offset, int tupleSize, int stride = 0);
|
||||||
int stride = 0) {
|
|
||||||
ShaderBindScope lock(&mProgram, mBound);
|
|
||||||
mVAO.bind();
|
|
||||||
mProgram.setAttributeBuffer(location, type, offset, tupleSize, stride);
|
|
||||||
mVAO.release();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Accessors
|
* Accessors
|
||||||
|
@ -120,7 +206,10 @@ namespace Qtk {
|
||||||
*/
|
*/
|
||||||
static MeshRenderer * getInstance(const QString & name);
|
static MeshRenderer * getInstance(const QString & name);
|
||||||
|
|
||||||
Transform3D & getTransform() { return mTransform; }
|
/**
|
||||||
|
* @return Transform3D attached to this MeshRenderer.
|
||||||
|
*/
|
||||||
|
inline Transform3D & getTransform() { return mTransform; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Model classes for importing with Assimp ##
|
## About: Model class for importing with Assimp ##
|
||||||
## From following tutorials on learnopengl.com ##
|
## From following tutorials on learnopengl.com ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -15,145 +15,24 @@
|
||||||
|
|
||||||
using namespace Qtk;
|
using namespace Qtk;
|
||||||
|
|
||||||
|
/** Static QHash used to store and access models globally. */
|
||||||
Model::ModelManager Model::mManager;
|
Model::ModelManager Model::mManager;
|
||||||
|
|
||||||
// Static function to access ModelManager for getting Models by name
|
|
||||||
Model * Model::getInstance(const char * name) {
|
|
||||||
return mManager[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* ModelMesh Private Member Functions
|
* Public Member Functions
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void ModelMesh::initMesh(const char * vert, const char * frag) {
|
|
||||||
initializeOpenGLFunctions();
|
|
||||||
|
|
||||||
// Create VAO, VBO, EBO
|
|
||||||
mVAO->create();
|
|
||||||
mVBO->create();
|
|
||||||
mEBO->create();
|
|
||||||
|
|
||||||
mVAO->bind();
|
|
||||||
|
|
||||||
// Allocate VBO
|
|
||||||
mVBO->setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
||||||
mVBO->bind();
|
|
||||||
|
|
||||||
mVBO->allocate(mVertices.data(), mVertices.size() * sizeof(mVertices[0]));
|
|
||||||
|
|
||||||
// Allocate EBO
|
|
||||||
mEBO->setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
||||||
mEBO->bind();
|
|
||||||
mEBO->allocate(mIndices.data(), mIndices.size() * sizeof(mIndices[0]));
|
|
||||||
mEBO->release();
|
|
||||||
|
|
||||||
// Load and link shaders
|
|
||||||
mProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, vert);
|
|
||||||
mProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, frag);
|
|
||||||
mProgram->link();
|
|
||||||
mProgram->bind();
|
|
||||||
|
|
||||||
// Positions
|
|
||||||
mProgram->enableAttributeArray(0);
|
|
||||||
mProgram->setAttributeBuffer(
|
|
||||||
0, GL_FLOAT, offsetof(ModelVertex, mPosition), 3, sizeof(ModelVertex));
|
|
||||||
|
|
||||||
// Normals
|
|
||||||
mProgram->enableAttributeArray(1);
|
|
||||||
mProgram->setAttributeBuffer(
|
|
||||||
1, GL_FLOAT, offsetof(ModelVertex, mNormal), 3, sizeof(ModelVertex));
|
|
||||||
|
|
||||||
// Texture Coordinates
|
|
||||||
mProgram->enableAttributeArray(2);
|
|
||||||
mProgram->setAttributeBuffer(
|
|
||||||
2, GL_FLOAT, offsetof(ModelVertex, mTextureCoord), 2,
|
|
||||||
sizeof(ModelVertex));
|
|
||||||
|
|
||||||
// Vertex tangents
|
|
||||||
mProgram->enableAttributeArray(3);
|
|
||||||
mProgram->setAttributeBuffer(
|
|
||||||
3, GL_FLOAT, offsetof(ModelVertex, mTangent), 3, sizeof(ModelVertex));
|
|
||||||
|
|
||||||
// Vertex bitangents
|
|
||||||
mProgram->enableAttributeArray(4);
|
|
||||||
mProgram->setAttributeBuffer(
|
|
||||||
4, GL_FLOAT, offsetof(ModelVertex, mBitangent), 3, sizeof(ModelVertex));
|
|
||||||
|
|
||||||
mProgram->release();
|
|
||||||
mVBO->release();
|
|
||||||
mVAO->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* ModelMesh Public Member Functions
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void ModelMesh::draw(QOpenGLShaderProgram & shader) {
|
|
||||||
mVAO->bind();
|
|
||||||
// Bind shader
|
|
||||||
shader.bind();
|
|
||||||
|
|
||||||
// Set Model View Projection values
|
|
||||||
shader.setUniformValue("uModel", mTransform.toMatrix());
|
|
||||||
shader.setUniformValue("uView", Scene::getViewMatrix());
|
|
||||||
shader.setUniformValue("uProjection", Scene::getProjectionMatrix());
|
|
||||||
|
|
||||||
GLuint diffuseCount = 1;
|
|
||||||
GLuint specularCount = 1;
|
|
||||||
GLuint normalCount = 1;
|
|
||||||
for(GLuint i = 0; i < mTextures.size(); i++) {
|
|
||||||
// Activate the current texture index by adding offset to GL_TEXTURE0
|
|
||||||
glActiveTexture(GL_TEXTURE0 + i);
|
|
||||||
mTextures[i].mTexture->bind();
|
|
||||||
|
|
||||||
// Get a name for the texture using a known convention -
|
|
||||||
// Diffuse: material.texture_diffuse1, material.texture_diffuse2, ...
|
|
||||||
// Specular: material.texture_specular1, material.texture_specular2, ...
|
|
||||||
std::string number;
|
|
||||||
std::string name = mTextures[i].mType;
|
|
||||||
if(name == "texture_diffuse") {
|
|
||||||
number = std::to_string(diffuseCount++);
|
|
||||||
}
|
|
||||||
if(name == "texture_specular") {
|
|
||||||
number = std::to_string(specularCount++);
|
|
||||||
}
|
|
||||||
if(name == "texture_normal") {
|
|
||||||
number = std::to_string(normalCount++);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the uniform to track this texture ID using our naming convention
|
|
||||||
shader.setUniformValue((name + number).c_str(), i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the mesh
|
|
||||||
glDrawElements(
|
|
||||||
GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_INT, mIndices.data());
|
|
||||||
|
|
||||||
// Release shader, textures
|
|
||||||
for(const auto & texture : mTextures) {
|
|
||||||
texture.mTexture->release();
|
|
||||||
}
|
|
||||||
shader.release();
|
|
||||||
mVAO->release();
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Model Public Member Functions
|
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void Model::draw() {
|
void Model::draw() {
|
||||||
for(auto & mMeshe : mMeshes) {
|
for(auto & mesh : mMeshes) {
|
||||||
mMeshe.mTransform = mTransform;
|
mesh.mTransform = mTransform;
|
||||||
mMeshe.draw();
|
mesh.draw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::draw(QOpenGLShaderProgram & shader) {
|
void Model::draw(QOpenGLShaderProgram & shader) {
|
||||||
for(auto & mMeshe : mMeshes) {
|
for(auto & mesh : mMeshes) {
|
||||||
mMeshe.mTransform = mTransform;
|
mesh.mTransform = mTransform;
|
||||||
mMeshe.draw(shader);
|
mesh.draw(shader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,8 +54,13 @@ void Model::flipTexture(const std::string & fileName, bool flipX, bool flipY) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Static function to access ModelManager for getting Models by name
|
||||||
|
Model * Qtk::Model::getInstance(const char * name) {
|
||||||
|
return mManager[name];
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Model Private Member Functions
|
* Private Member Functions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void Model::loadModel(const std::string & path) {
|
void Model::loadModel(const std::string & path) {
|
||||||
|
@ -210,7 +94,7 @@ void Model::loadModel(const std::string & path) {
|
||||||
// Sort models by their distance from the camera
|
// Sort models by their distance from the camera
|
||||||
// Optimizes drawing so that overlapping objects are not overwritten
|
// Optimizes drawing so that overlapping objects are not overwritten
|
||||||
// + Since the topmost object will be drawn first
|
// + Since the topmost object will be drawn first
|
||||||
sortModels();
|
sortModelMeshes();
|
||||||
|
|
||||||
// Object finished loading, insert it into ModelManager
|
// Object finished loading, insert it into ModelManager
|
||||||
mManager.insert(getName(), this);
|
mManager.insert(getName(), this);
|
||||||
|
@ -362,7 +246,7 @@ ModelMesh::Textures Model::loadMaterialTextures(
|
||||||
return textures;
|
return textures;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::sortModels() {
|
void Model::sortModelMeshes() {
|
||||||
auto cameraPos = Scene::getCamera().getTransform();
|
auto cameraPos = Scene::getCamera().getTransform();
|
||||||
auto cameraDistance = [&cameraPos](const ModelMesh & a, const ModelMesh & b) {
|
auto cameraDistance = [&cameraPos](const ModelMesh & a, const ModelMesh & b) {
|
||||||
// Sort by the first vertex position in the model
|
// Sort by the first vertex position in the model
|
||||||
|
|
193
src/qtk/model.h
193
src/qtk/model.h
|
@ -1,7 +1,7 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Model classes for importing with Assimp ##
|
## About: Model class for importing with Assimp ##
|
||||||
## From following tutorials on learnopengl.com ##
|
## From following tutorials on learnopengl.com ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -9,115 +9,19 @@
|
||||||
#ifndef QTK_MODEL_H
|
#ifndef QTK_MODEL_H
|
||||||
#define QTK_MODEL_H
|
#define QTK_MODEL_H
|
||||||
|
|
||||||
// QT
|
// Qt
|
||||||
#include <QObject>
|
|
||||||
#include <QOpenGLBuffer>
|
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
#include <QOpenGLShaderProgram>
|
|
||||||
#include <QOpenGLTexture>
|
|
||||||
#include <QOpenGLVertexArrayObject>
|
|
||||||
|
|
||||||
// Assimp
|
// Assimp
|
||||||
#include <assimp/postprocess.h>
|
#include <assimp/postprocess.h>
|
||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
#include <assimp/Importer.hpp>
|
#include <assimp/Importer.hpp>
|
||||||
|
|
||||||
// QTK
|
// Qtk
|
||||||
#include "object.h"
|
#include "modelmesh.h"
|
||||||
#include "qtkapi.h"
|
#include "qtkapi.h"
|
||||||
#include "transform3D.h"
|
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
/**
|
|
||||||
* 3D models will store this data for each vertex in geometry.
|
|
||||||
*/
|
|
||||||
struct QTKAPI ModelVertex {
|
|
||||||
QVector3D mPosition;
|
|
||||||
QVector3D mNormal;
|
|
||||||
QVector2D mTextureCoord;
|
|
||||||
QVector3D mTangent;
|
|
||||||
QVector3D mBitangent;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Struct to store model textures. 3D Models may have multiple.
|
|
||||||
*/
|
|
||||||
struct QTKAPI ModelTexture {
|
|
||||||
GLuint mID {};
|
|
||||||
QOpenGLTexture * mTexture {};
|
|
||||||
std::string mType {};
|
|
||||||
std::string mPath {};
|
|
||||||
};
|
|
||||||
|
|
||||||
class Model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mesh class specialized for storing 3D model data.
|
|
||||||
* Eventually this can be consolidated into a more generic class.
|
|
||||||
*/
|
|
||||||
class QTKAPI ModelMesh : protected QOpenGLFunctions {
|
|
||||||
public:
|
|
||||||
/*************************************************************************
|
|
||||||
* Typedefs
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
friend Model;
|
|
||||||
typedef std::vector<ModelVertex> Vertices;
|
|
||||||
typedef std::vector<GLuint> Indices;
|
|
||||||
typedef std::vector<ModelTexture> Textures;
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Constructors, Destructors
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ModelMesh(
|
|
||||||
Vertices vertices, Indices indices, Textures textures,
|
|
||||||
const char * vertexShader = ":/model-basic.vert",
|
|
||||||
const char * fragmentShader = ":/model-basic.frag") :
|
|
||||||
mProgram(new QOpenGLShaderProgram),
|
|
||||||
mVAO(new QOpenGLVertexArrayObject),
|
|
||||||
mVBO(new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer)),
|
|
||||||
mEBO(new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer)),
|
|
||||||
mVertices(std::move(vertices)), mIndices(std::move(indices)),
|
|
||||||
mTextures(std::move(textures)) {
|
|
||||||
initMesh(vertexShader, fragmentShader);
|
|
||||||
}
|
|
||||||
|
|
||||||
~ModelMesh() = default;
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Public Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
inline void draw() { draw(*mProgram); }
|
|
||||||
|
|
||||||
void draw(QOpenGLShaderProgram & shader);
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Public Members
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
Vertices mVertices {};
|
|
||||||
Indices mIndices {};
|
|
||||||
Textures mTextures {};
|
|
||||||
Transform3D mTransform;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/*************************************************************************
|
|
||||||
* Private Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
void initMesh(const char * vert, const char * frag);
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Private Members
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
QOpenGLBuffer *mVBO, *mEBO;
|
|
||||||
QOpenGLVertexArrayObject * mVAO;
|
|
||||||
QOpenGLShaderProgram * mProgram;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model object that has a ModelMesh.
|
* Model object that has a ModelMesh.
|
||||||
* Top-level object that represents 3D models stored within a scene.
|
* Top-level object that represents 3D models stored within a scene.
|
||||||
|
@ -128,19 +32,27 @@ namespace Qtk {
|
||||||
* Typedefs
|
* Typedefs
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
/* ModelManager typedef that will manage global model access. */
|
/** ModelManager typedef that will manage global model access. */
|
||||||
typedef QHash<QString, Model *> ModelManager;
|
typedef QHash<QString, Model *> ModelManager;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Constructors, Destructors
|
* Constructors, Destructors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Default model shaders are provided but we can override them in the ctor
|
/**
|
||||||
|
* Constructs a Model
|
||||||
|
* If no shaders are provided we will use default shaders.
|
||||||
|
*
|
||||||
|
* @param name Name to use for the Model's objectName.
|
||||||
|
* @param path Path to the model to load for construction.
|
||||||
|
* @param vertexShader Optional path to custom vertex shader.
|
||||||
|
* @param fragmentShader Optional path to custom fragment shader.
|
||||||
|
*/
|
||||||
inline Model(
|
inline Model(
|
||||||
const char * name, const char * path,
|
const char * name, const char * path,
|
||||||
const char * vertexShader = ":/model-basic.vert",
|
const char * vertexShader = ":/model-basic.vert",
|
||||||
const char * fragmentShader = ":/model-basic.frag") :
|
const char * fragmentShader = ":/model-basic.frag") :
|
||||||
Object(name, MODEL),
|
Object(name, QTK_MODEL),
|
||||||
mModelPath(path), mVertexShader(vertexShader),
|
mModelPath(path), mVertexShader(vertexShader),
|
||||||
mFragmentShader(fragmentShader) {
|
mFragmentShader(fragmentShader) {
|
||||||
loadModel(mModelPath);
|
loadModel(mModelPath);
|
||||||
|
@ -152,7 +64,16 @@ namespace Qtk {
|
||||||
* Public Methods
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws the model using attached shader program.
|
||||||
|
*/
|
||||||
void draw();
|
void draw();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws the model using a custom shader program.
|
||||||
|
*
|
||||||
|
* @param shader Shader program to use to draw the model.
|
||||||
|
*/
|
||||||
void draw(QOpenGLShaderProgram & shader);
|
void draw(QOpenGLShaderProgram & shader);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -170,13 +91,13 @@ namespace Qtk {
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a uniform value
|
* Sets a uniform value for each ModelMesh within this Model.
|
||||||
*
|
*
|
||||||
* @tparam T The type of the value we are settings
|
* @tparam T The type of the value we are settings
|
||||||
* @param location The uniform location
|
* @param location The uniform location
|
||||||
* @param value The value to assign to the uniform
|
* @param value The value to assign to the uniform
|
||||||
*/
|
*/
|
||||||
template <typename T> void setUniform(const char * location, T value) {
|
template <typename T> inline void setUniform(const char * location, T value) {
|
||||||
for(auto & mesh : mMeshes) {
|
for(auto & mesh : mMeshes) {
|
||||||
mesh.mProgram->bind();
|
mesh.mProgram->bind();
|
||||||
mesh.mProgram->setUniformValue(location, value);
|
mesh.mProgram->setUniformValue(location, value);
|
||||||
|
@ -195,9 +116,12 @@ namespace Qtk {
|
||||||
* @param name The name of the model to load as it was constructed.
|
* @param name The name of the model to load as it was constructed.
|
||||||
* @return Pointer to the model stored within the scene.
|
* @return Pointer to the model stored within the scene.
|
||||||
*/
|
*/
|
||||||
static Model * getInstance(const char * name);
|
[[nodiscard]] static Model * getInstance(const char * name);
|
||||||
|
|
||||||
Transform3D & getTransform() { return mTransform; }
|
/**
|
||||||
|
* @return Transform3D attached to this Model.
|
||||||
|
*/
|
||||||
|
inline Transform3D & getTransform() { return mTransform; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -209,44 +133,69 @@ namespace Qtk {
|
||||||
* For a full list of formats see assimp documentation:
|
* For a full list of formats see assimp documentation:
|
||||||
* https://github.com/assimp/assimp/blob/master/doc/Fileformats.md
|
* https://github.com/assimp/assimp/blob/master/doc/Fileformats.md
|
||||||
*
|
*
|
||||||
* Models should not be loaded into Qt resource system.
|
* Large models should not be loaded into Qt resource system.
|
||||||
* Instead pass an *absolute* path to this function.
|
* Instead pass an *absolute* path to this function.
|
||||||
* Relative paths will break if Qtk is executed from different locations.
|
* Relative paths will break if Qtk is executed from different locations.
|
||||||
*
|
*
|
||||||
* Models can also be loaded from the `qtk/resource` directory using qrc
|
|
||||||
* format loadModel(":/models/backpack/backpack.obj").
|
|
||||||
* This does not use Qt resource system, it just provides similar syntax
|
|
||||||
* for accessing files within the same `resources/` directory.
|
|
||||||
*
|
|
||||||
* See resourcemanager.h for more information on how this works.
|
|
||||||
*
|
|
||||||
* @param path Absolute path to a model in .obj or another format accepted
|
* @param path Absolute path to a model in .obj or another format accepted
|
||||||
* by assimp.
|
* by assimp.
|
||||||
*/
|
*/
|
||||||
void loadModel(const std::string & path);
|
void loadModel(const std::string & path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a node in the model's geometry using Assimp.
|
||||||
|
*
|
||||||
|
* @param node The Assimp node to process.
|
||||||
|
* @param scene The Assimp scene for the loaded model.
|
||||||
|
*/
|
||||||
void processNode(aiNode * node, const aiScene * scene);
|
void processNode(aiNode * node, const aiScene * scene);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a mesh within a node using Assimp.
|
||||||
|
*
|
||||||
|
* @param mesh The Assimp mesh to process.
|
||||||
|
* @param scene The Assimp scene for the loaded model.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
ModelMesh processMesh(aiMesh * mesh, const aiScene * scene);
|
ModelMesh processMesh(aiMesh * mesh, const aiScene * scene);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a collection of material texture using Assimp.
|
||||||
|
* This function loads diffuse, specular, and narmal material textures.
|
||||||
|
* A Mesh may have many of any or all of the texture types above.
|
||||||
|
* Models can have many Meshes attached.
|
||||||
|
* This function returns all textures for a single Mesh within a Model.
|
||||||
|
*
|
||||||
|
* @param mat Loaded Assimp material.
|
||||||
|
* @param type Type of the material.
|
||||||
|
* @param typeName Texture type name in string format.
|
||||||
|
* @return Collection of all textures for a single ModelMesh.
|
||||||
|
*/
|
||||||
ModelMesh::Textures loadMaterialTextures(
|
ModelMesh::Textures loadMaterialTextures(
|
||||||
aiMaterial * mat, aiTextureType type, const std::string & typeName);
|
aiMaterial * mat, aiTextureType type, const std::string & typeName);
|
||||||
|
|
||||||
void sortModels();
|
/**
|
||||||
|
* Sorts each mesh in the Model based on distance from the camera.
|
||||||
|
* This is for efficient drawing in OpenGL by preventing the drawing of
|
||||||
|
* objects not visible due to being partially or entirely behind another
|
||||||
|
* object.
|
||||||
|
*/
|
||||||
|
void sortModelMeshes();
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
/* Static QHash used to store and access models globally. */
|
|
||||||
|
/** Static QHash used to store and access models globally. */
|
||||||
static ModelManager mManager;
|
static ModelManager mManager;
|
||||||
|
|
||||||
/* Container to store N loaded textures for this model. */
|
/** Container to store N loaded textures for this model. */
|
||||||
ModelMesh::Textures mTexturesLoaded {};
|
ModelMesh::Textures mTexturesLoaded {};
|
||||||
/* Container to store N loaded meshes for this model. */
|
/** Container to store N loaded meshes for this model. */
|
||||||
std::vector<ModelMesh> mMeshes {};
|
std::vector<ModelMesh> mMeshes {};
|
||||||
/* The directory this model and it's textures are stored. */
|
/** The directory this model and it's textures are stored. */
|
||||||
std::string mDirectory {};
|
std::string mDirectory {};
|
||||||
/* File names for shaders and 3D model on disk. */
|
/** File names for shaders and 3D model on disk. */
|
||||||
const char *mVertexShader, *mFragmentShader, *mModelPath;
|
const char *mVertexShader, *mFragmentShader, *mModelPath;
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*##############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
|
## About: ModelMesh class for importing 3D models with Assimp ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
##############################################################################*/
|
||||||
|
|
||||||
|
#include "scene.h"
|
||||||
|
#include "modelmesh.h"
|
||||||
|
|
||||||
|
using namespace Qtk;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Public Member Functions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void ModelMesh::draw(QOpenGLShaderProgram & shader) {
|
||||||
|
mVAO->bind();
|
||||||
|
// Bind shader
|
||||||
|
shader.bind();
|
||||||
|
|
||||||
|
// Set Model View Projection values
|
||||||
|
shader.setUniformValue("uModel", mTransform.toMatrix());
|
||||||
|
shader.setUniformValue("uView", Scene::getViewMatrix());
|
||||||
|
shader.setUniformValue("uProjection", Scene::getProjectionMatrix());
|
||||||
|
|
||||||
|
GLuint diffuseCount = 1;
|
||||||
|
GLuint specularCount = 1;
|
||||||
|
GLuint normalCount = 1;
|
||||||
|
for(GLuint i = 0; i < mTextures.size(); i++) {
|
||||||
|
// Activate the current texture index by adding offset to GL_TEXTURE0
|
||||||
|
glActiveTexture(GL_TEXTURE0 + i);
|
||||||
|
mTextures[i].mTexture->bind();
|
||||||
|
|
||||||
|
// Get a name for the texture using a known convention -
|
||||||
|
// Diffuse: material.texture_diffuse1, material.texture_diffuse2, ...
|
||||||
|
// Specular: material.texture_specular1, material.texture_specular2, ...
|
||||||
|
std::string number;
|
||||||
|
std::string name = mTextures[i].mType;
|
||||||
|
if(name == "texture_diffuse") {
|
||||||
|
number = std::to_string(diffuseCount++);
|
||||||
|
}
|
||||||
|
if(name == "texture_specular") {
|
||||||
|
number = std::to_string(specularCount++);
|
||||||
|
}
|
||||||
|
if(name == "texture_normal") {
|
||||||
|
number = std::to_string(normalCount++);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the uniform to track this texture ID using our naming convention
|
||||||
|
shader.setUniformValue((name + number).c_str(), i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the mesh
|
||||||
|
glDrawElements(
|
||||||
|
GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_INT, mIndices.data());
|
||||||
|
|
||||||
|
// Release shader, textures
|
||||||
|
for(const auto & texture : mTextures) {
|
||||||
|
texture.mTexture->release();
|
||||||
|
}
|
||||||
|
shader.release();
|
||||||
|
mVAO->release();
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Private Member Functions
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void ModelMesh::initMesh(const char * vert, const char * frag) {
|
||||||
|
initializeOpenGLFunctions();
|
||||||
|
|
||||||
|
// Create VAO, VBO, EBO
|
||||||
|
mVAO->create();
|
||||||
|
mVBO->create();
|
||||||
|
mEBO->create();
|
||||||
|
|
||||||
|
mVAO->bind();
|
||||||
|
|
||||||
|
// Allocate VBO
|
||||||
|
mVBO->setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||||
|
mVBO->bind();
|
||||||
|
|
||||||
|
mVBO->allocate(mVertices.data(), mVertices.size() * sizeof(mVertices[0]));
|
||||||
|
|
||||||
|
// Allocate EBO
|
||||||
|
mEBO->setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||||
|
mEBO->bind();
|
||||||
|
mEBO->allocate(mIndices.data(), mIndices.size() * sizeof(mIndices[0]));
|
||||||
|
mEBO->release();
|
||||||
|
|
||||||
|
// Load and link shaders
|
||||||
|
mProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, vert);
|
||||||
|
mProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, frag);
|
||||||
|
mProgram->link();
|
||||||
|
mProgram->bind();
|
||||||
|
|
||||||
|
// Positions
|
||||||
|
mProgram->enableAttributeArray(0);
|
||||||
|
mProgram->setAttributeBuffer(
|
||||||
|
0, GL_FLOAT, offsetof(ModelVertex, mPosition), 3, sizeof(ModelVertex));
|
||||||
|
|
||||||
|
// Normals
|
||||||
|
mProgram->enableAttributeArray(1);
|
||||||
|
mProgram->setAttributeBuffer(
|
||||||
|
1, GL_FLOAT, offsetof(ModelVertex, mNormal), 3, sizeof(ModelVertex));
|
||||||
|
|
||||||
|
// Texture Coordinates
|
||||||
|
mProgram->enableAttributeArray(2);
|
||||||
|
mProgram->setAttributeBuffer(
|
||||||
|
2, GL_FLOAT, offsetof(ModelVertex, mTextureCoord), 2,
|
||||||
|
sizeof(ModelVertex));
|
||||||
|
|
||||||
|
// Vertex tangents
|
||||||
|
mProgram->enableAttributeArray(3);
|
||||||
|
mProgram->setAttributeBuffer(
|
||||||
|
3, GL_FLOAT, offsetof(ModelVertex, mTangent), 3, sizeof(ModelVertex));
|
||||||
|
|
||||||
|
// Vertex bitangents
|
||||||
|
mProgram->enableAttributeArray(4);
|
||||||
|
mProgram->setAttributeBuffer(
|
||||||
|
4, GL_FLOAT, offsetof(ModelVertex, mBitangent), 3, sizeof(ModelVertex));
|
||||||
|
|
||||||
|
mProgram->release();
|
||||||
|
mVBO->release();
|
||||||
|
mVAO->release();
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
/*##############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
|
## About: ModelMesh class for importing 3D models with Assimp ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
##############################################################################*/
|
||||||
|
|
||||||
|
#ifndef QTK_MODELMESH_H
|
||||||
|
#define QTK_MODELMESH_H
|
||||||
|
|
||||||
|
// QTK
|
||||||
|
#include "object.h"
|
||||||
|
#include "transform3D.h"
|
||||||
|
|
||||||
|
namespace Qtk {
|
||||||
|
/**
|
||||||
|
* 3D models will store this data for each vertex in geometry.
|
||||||
|
*/
|
||||||
|
struct QTKAPI ModelVertex {
|
||||||
|
QVector3D mPosition;
|
||||||
|
QVector3D mNormal;
|
||||||
|
QVector2D mTextureCoord;
|
||||||
|
QVector3D mTangent;
|
||||||
|
QVector3D mBitangent;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct to store model textures. 3D Models may have multiple.
|
||||||
|
*/
|
||||||
|
struct QTKAPI ModelTexture {
|
||||||
|
/** Texture ID for for this texture. */
|
||||||
|
GLuint mID {};
|
||||||
|
QOpenGLTexture * mTexture {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of this texture in string format.
|
||||||
|
* See calls to Model::loadMaterialTexture in Model::processMesh
|
||||||
|
*/
|
||||||
|
std::string mType {};
|
||||||
|
/** Path to the model on disk. */
|
||||||
|
std::string mPath {};
|
||||||
|
};
|
||||||
|
|
||||||
|
class Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mesh class specialized for storing 3D model data.
|
||||||
|
* Eventually this can be consolidated into a more generic class.
|
||||||
|
*/
|
||||||
|
class QTKAPI ModelMesh : protected QOpenGLFunctions {
|
||||||
|
public:
|
||||||
|
/*************************************************************************
|
||||||
|
* Typedefs
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
friend Model;
|
||||||
|
typedef std::vector<ModelVertex> Vertices;
|
||||||
|
typedef std::vector<GLuint> Indices;
|
||||||
|
typedef std::vector<ModelTexture> Textures;
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Constructors, Destructors
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a ModelMesh.
|
||||||
|
* If no shaders are provided defaults will be used.
|
||||||
|
*
|
||||||
|
* @param vertices Vertex data to use for this ModelMesh.
|
||||||
|
* @param indices Index data to use for this ModelMesh.
|
||||||
|
* @param textures Collection of ModelTextures for this ModelMesh.
|
||||||
|
* @param vertexShader Path to vertex shader for this ModelMesh.
|
||||||
|
* @param fragmentShader Path to fragment shader for this ModelMesh.
|
||||||
|
*/
|
||||||
|
ModelMesh(
|
||||||
|
Vertices vertices, Indices indices, Textures textures,
|
||||||
|
const char * vertexShader = ":/model-basic.vert",
|
||||||
|
const char * fragmentShader = ":/model-basic.frag") :
|
||||||
|
mProgram(new QOpenGLShaderProgram),
|
||||||
|
mVAO(new QOpenGLVertexArrayObject),
|
||||||
|
mVBO(new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer)),
|
||||||
|
mEBO(new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer)),
|
||||||
|
mVertices(std::move(vertices)), mIndices(std::move(indices)),
|
||||||
|
mTextures(std::move(textures)) {
|
||||||
|
initMesh(vertexShader, fragmentShader);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ModelMesh() = default;
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the model with the attached shader program.
|
||||||
|
*/
|
||||||
|
inline void draw() { draw(*mProgram); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the model with a custom shader program.
|
||||||
|
* @param shader The shader program to use for drawing the object.
|
||||||
|
*/
|
||||||
|
void draw(QOpenGLShaderProgram & shader);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Public Members
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
Vertices mVertices {};
|
||||||
|
Indices mIndices {};
|
||||||
|
Textures mTextures {};
|
||||||
|
Transform3D mTransform;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*************************************************************************
|
||||||
|
* Private Methods
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the buffers and shaders for this model mesh.
|
||||||
|
*
|
||||||
|
* @param vert Path to vertex shader to use for this model.
|
||||||
|
* @param frag Path to fragment shader to use for this model.
|
||||||
|
*/
|
||||||
|
void initMesh(const char * vert, const char * frag);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Private Members
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
QOpenGLBuffer *mVBO, *mEBO;
|
||||||
|
QOpenGLVertexArrayObject * mVAO;
|
||||||
|
QOpenGLShaderProgram * mProgram;
|
||||||
|
};
|
||||||
|
} // namespace Qtk
|
||||||
|
|
||||||
|
#endif // QTK_MODELMESH_H
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Object class for storing object data ##
|
## About: Object class for storing object data ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Object class for storing object data ##
|
## About: Object class for storing object data ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -13,8 +13,8 @@
|
||||||
#include <QOpenGLTexture>
|
#include <QOpenGLTexture>
|
||||||
#include <QOpenGLVertexArrayObject>
|
#include <QOpenGLVertexArrayObject>
|
||||||
|
|
||||||
#include "mesh.h"
|
|
||||||
#include "qtkapi.h"
|
#include "qtkapi.h"
|
||||||
|
#include "shape.h"
|
||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
|
@ -38,7 +38,7 @@ namespace Qtk {
|
||||||
/**
|
/**
|
||||||
* Enum flag to identify Object type without casting.
|
* Enum flag to identify Object type without casting.
|
||||||
*/
|
*/
|
||||||
enum Type { OBJECT, MESH, MODEL };
|
enum Type { QTK_OBJECT, QTK_MESH, QTK_MODEL };
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Constructors / Destructors
|
* Constructors / Destructors
|
||||||
|
@ -47,12 +47,16 @@ namespace Qtk {
|
||||||
// Initialize an object with no shape data assigned
|
// Initialize an object with no shape data assigned
|
||||||
explicit Object(const char * name, Type type) :
|
explicit Object(const char * name, Type type) :
|
||||||
mName(name), mVBO(QOpenGLBuffer::VertexBuffer), mBound(false),
|
mName(name), mVBO(QOpenGLBuffer::VertexBuffer), mBound(false),
|
||||||
mType(type) {}
|
mType(type) {
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize an object with shape data assigned
|
// Initialize an object with shape data assigned
|
||||||
Object(const char * name, const ShapeBase & shape, Type type) :
|
Object(const char * name, const ShapeBase & shape, Type type) :
|
||||||
mName(name), mVBO(QOpenGLBuffer::VertexBuffer), mShape(shape),
|
mName(name), mVBO(QOpenGLBuffer::VertexBuffer), mShape(shape),
|
||||||
mBound(false), mType(type) {}
|
mBound(false), mType(type) {
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
~Object() override = default;
|
~Object() override = default;
|
||||||
|
|
||||||
|
@ -156,7 +160,7 @@ namespace Qtk {
|
||||||
Texture mTexture;
|
Texture mTexture;
|
||||||
const char * mName;
|
const char * mName;
|
||||||
bool mBound;
|
bool mBound;
|
||||||
Type mType = OBJECT;
|
Type mType = QTK_OBJECT;
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Main window for Qt6 OpenGL widget application ##
|
## About: Main window for Qt6 OpenGL widget application ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
#ifndef QTK_QTKAPI_H
|
#ifndef QTK_QTKAPI_H
|
||||||
#define QTK_QTKAPI_H
|
#define QTK_QTKAPI_H
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QtCore/QtGlobal>
|
#include <QtCore/QtGlobal>
|
||||||
|
|
||||||
|
@ -41,8 +42,11 @@ namespace Qtk {
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Default icon to use for Qtk desktop application.
|
||||||
|
*/
|
||||||
static QIcon getIcon() {
|
static QIcon getIcon() {
|
||||||
return QIcon(":/icon.png");
|
return QIcon(":/icons/resources/icon.png");
|
||||||
}
|
}
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Classes for managing objects and data within a scene ##
|
## About: Classes for managing objects and data within a scene ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -15,7 +15,7 @@ Camera3D Scene::mCamera;
|
||||||
QMatrix4x4 Scene::mProjection;
|
QMatrix4x4 Scene::mProjection;
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Constructors, Destructors
|
* Constructors / Destructors
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
Scene::Scene() : mSceneName("Default Scene") {
|
Scene::Scene() : mSceneName("Default Scene") {
|
||||||
|
@ -34,7 +34,7 @@ Scene::~Scene() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Accessors
|
* Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
std::vector<Object *> Scene::getObjects() const {
|
std::vector<Object *> Scene::getObjects() const {
|
||||||
|
@ -49,9 +49,14 @@ std::vector<Object *> Scene::getObjects() const {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
Object * Scene::getObject(const QString & name) {
|
||||||
* Setters
|
for(auto object : getObjects()) {
|
||||||
******************************************************************************/
|
if(object->getName() == name) {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Q_NULLPTR;
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::setSkybox(Skybox * skybox) {
|
void Scene::setSkybox(Skybox * skybox) {
|
||||||
delete mSkybox;
|
delete mSkybox;
|
||||||
|
@ -90,12 +95,3 @@ void Scene::privateDraw() {
|
||||||
mesh->draw();
|
mesh->draw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Object * Scene::getObject(const QString & name) {
|
|
||||||
for(auto object : getObjects()) {
|
|
||||||
if(object->getName() == name) {
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Q_NULLPTR;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Classes for managing objects and data within a scene ##
|
## About: Classes for managing objects and data within a scene ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -78,25 +78,43 @@ namespace Qtk {
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return All Qtk::Objects within the scene.
|
||||||
|
* If any object is invalid, we return an empty vector.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] std::vector<Object *> getObjects() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve and object from the scene by it's objectName.
|
||||||
|
*
|
||||||
|
* @param name The objectName to look for within this scene.
|
||||||
|
* @return The found object or Q_NULLPTR if none found.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] Object * getObject(const QString & name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Camera attached to this scene.
|
* @return Camera attached to this scene.
|
||||||
*/
|
*/
|
||||||
static Camera3D & getCamera() { return mCamera; }
|
[[nodiscard]] inline static Camera3D & getCamera() { return mCamera; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return View matrix for the camera attached to this scene.
|
* @return View matrix for the camera attached to this scene.
|
||||||
*/
|
*/
|
||||||
static QMatrix4x4 getViewMatrix() { return mCamera.toMatrix(); }
|
[[nodiscard]] inline static QMatrix4x4 getViewMatrix() {
|
||||||
|
return mCamera.toMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Projection matrix for the current view into the scene.
|
* @return Projection matrix for the current view into the scene.
|
||||||
*/
|
*/
|
||||||
static QMatrix4x4 & getProjectionMatrix() { return mProjection; }
|
[[nodiscard]] inline static QMatrix4x4 & getProjectionMatrix() {
|
||||||
|
return mProjection;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The active skybox for this scene.
|
* @return The active skybox for this scene.
|
||||||
*/
|
*/
|
||||||
inline Skybox * getSkybox() { return mSkybox; }
|
[[nodiscard]] inline Skybox * getSkybox() { return mSkybox; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The name for this scene. This is entirely user defined and not
|
* @return The name for this scene. This is entirely user defined and not
|
||||||
|
@ -119,14 +137,6 @@ namespace Qtk {
|
||||||
return mModels;
|
return mModels;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return All Qtk::Objects within the scene.
|
|
||||||
* If any object is invalid, we return an empty vector.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] std::vector<Object *> getObjects() const;
|
|
||||||
|
|
||||||
[[nodiscard]] Object * getObject(const QString & name);
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
@ -138,6 +148,13 @@ namespace Qtk {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds objects to the scene.
|
* Adds objects to the scene.
|
||||||
|
* This template provides explicit specializations for valid types.
|
||||||
|
* Adding any object other than these types will cause errors.
|
||||||
|
* TODO: Refactor to use Object base class container for scene objects.
|
||||||
|
*
|
||||||
|
* If creating a new object type for a scene, it must inherit Qtk::Object
|
||||||
|
* and provide a specialization for this method.
|
||||||
|
*
|
||||||
* @param object The new object to add to the scene.
|
* @param object The new object to add to the scene.
|
||||||
* @return The object added to the scene.
|
* @return The object added to the scene.
|
||||||
*/
|
*/
|
||||||
|
@ -149,17 +166,15 @@ namespace Qtk {
|
||||||
inline void setSceneName(QString name) { mSceneName = std::move(name); }
|
inline void setSceneName(QString name) { mSceneName = std::move(name); }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
/**
|
||||||
|
* Signal thrown when the scene is modified by adding or removing objects.
|
||||||
|
* This can be caught by a main application to update any associated data.
|
||||||
|
*
|
||||||
|
* @param sceneName The scene that has been updated.
|
||||||
|
*/
|
||||||
void sceneUpdated(QString sceneName);
|
void sceneUpdated(QString sceneName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
|
||||||
* Private Members
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
static Camera3D mCamera;
|
|
||||||
static QMatrix4x4 mProjection;
|
|
||||||
bool mInit = false;
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Methods
|
* Private Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
@ -170,11 +185,14 @@ namespace Qtk {
|
||||||
*/
|
*/
|
||||||
void privateDraw();
|
void privateDraw();
|
||||||
|
|
||||||
private:
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
static Camera3D mCamera;
|
||||||
|
static QMatrix4x4 mProjection;
|
||||||
|
bool mInit = false;
|
||||||
|
|
||||||
QString mSceneName;
|
QString mSceneName;
|
||||||
/* The skybox for this scene. */
|
/* The skybox for this scene. */
|
||||||
Skybox * mSkybox {};
|
Skybox * mSkybox {};
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Collection of static mesh data for quick initialization ##
|
## About: Collection of static mesh data for quick initialization ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
||||||
#include "mesh.h"
|
#include "shape.h"
|
||||||
|
|
||||||
using namespace Qtk;
|
using namespace Qtk;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Collection of static mesh data for quick initialization ##
|
## About: Collection of static mesh data for quick initialization ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
#ifndef QTK_MESH_H
|
#ifndef QTK_SHAPE_H
|
||||||
#define QTK_MESH_H
|
#define QTK_SHAPE_H
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -17,11 +17,6 @@
|
||||||
#include "qtkapi.h"
|
#include "qtkapi.h"
|
||||||
#include "transform3D.h"
|
#include "transform3D.h"
|
||||||
|
|
||||||
namespace Qtk {
|
|
||||||
class MeshRenderer;
|
|
||||||
|
|
||||||
class Object;
|
|
||||||
|
|
||||||
// Define vertices for drawing a cube using two faces (8 vertex points)
|
// Define vertices for drawing a cube using two faces (8 vertex points)
|
||||||
// Front Vertices
|
// Front Vertices
|
||||||
#define VERTEX_FTR QVector3D(0.5f, 0.5f, 0.5f) // 1
|
#define VERTEX_FTR QVector3D(0.5f, 0.5f, 0.5f) // 1
|
||||||
|
@ -63,7 +58,6 @@ namespace Qtk {
|
||||||
VECTOR_BACK, VECTOR_BACK, VECTOR_BACK
|
VECTOR_BACK, VECTOR_BACK, VECTOR_BACK
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
||||||
// Colors using QVector3Ds as RGB values
|
// Colors using QVector3Ds as RGB values
|
||||||
#define WHITE VECTOR_ONE
|
#define WHITE VECTOR_ONE
|
||||||
#define BLACK VECTOR_ZERO
|
#define BLACK VECTOR_ZERO
|
||||||
|
@ -79,6 +73,11 @@ namespace Qtk {
|
||||||
#define UV_RIGHT QVector2D(0.0f, 1.0f)
|
#define UV_RIGHT QVector2D(0.0f, 1.0f)
|
||||||
#define UV_CORNER QVector2D(1.0f, 1.0f)
|
#define UV_CORNER QVector2D(1.0f, 1.0f)
|
||||||
|
|
||||||
|
namespace Qtk {
|
||||||
|
class MeshRenderer;
|
||||||
|
|
||||||
|
class Object;
|
||||||
|
|
||||||
// TODO: Vertices.getData(); Vertices.getStride();
|
// TODO: Vertices.getData(); Vertices.getStride();
|
||||||
typedef std::vector<QVector3D> Vertices;
|
typedef std::vector<QVector3D> Vertices;
|
||||||
typedef std::vector<QVector3D> Colors;
|
typedef std::vector<QVector3D> Colors;
|
||||||
|
@ -106,6 +105,15 @@ namespace Qtk {
|
||||||
* Constructors / Destructors
|
* Constructors / Destructors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param mode OpenGL draw mode to use for this shape.
|
||||||
|
* @param v Vertex data for this shape.
|
||||||
|
* @param i Index data for this shape.
|
||||||
|
* @param c Color data for this shape.
|
||||||
|
* @param t Texture coordinates for this shape.
|
||||||
|
* @param n Normals for this shape.
|
||||||
|
*/
|
||||||
explicit ShapeBase(
|
explicit ShapeBase(
|
||||||
DrawMode mode = QTK_DRAW_ARRAYS, Vertices v = {}, Indices i = {},
|
DrawMode mode = QTK_DRAW_ARRAYS, Vertices v = {}, Indices i = {},
|
||||||
Colors c = {}, TexCoords t = {}, Normals n = {}) :
|
Colors c = {}, TexCoords t = {}, Normals n = {}) :
|
||||||
|
@ -118,24 +126,42 @@ namespace Qtk {
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Vertex data for this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const Vertices & getVertices() const {
|
[[nodiscard]] inline const Vertices & getVertices() const {
|
||||||
return mVertices;
|
return mVertices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Index data for this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const Indices & getIndexData() const {
|
[[nodiscard]] inline const Indices & getIndexData() const {
|
||||||
return mIndices;
|
return mIndices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Color data for this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const Colors & getColors() const { return mColors; }
|
[[nodiscard]] inline const Colors & getColors() const { return mColors; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Texture coordinates for this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const TexCoords & getTexCoords() const {
|
[[nodiscard]] inline const TexCoords & getTexCoords() const {
|
||||||
return mTexCoords;
|
return mTexCoords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Normals for this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const Normals & getNormals() const {
|
[[nodiscard]] inline const Normals & getNormals() const {
|
||||||
return mNormals;
|
return mNormals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Stride for texture coordinates on this shape.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline size_t getTexCoordsStride() const {
|
[[nodiscard]] inline size_t getTexCoordsStride() const {
|
||||||
return mTexCoords.size() * sizeof(mTexCoords[0]);
|
return mTexCoords.size() * sizeof(mTexCoords[0]);
|
||||||
}
|
}
|
||||||
|
@ -146,7 +172,6 @@ namespace Qtk {
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
DrawMode mDrawMode;
|
DrawMode mDrawMode;
|
||||||
|
|
||||||
Vertices mVertices {};
|
Vertices mVertices {};
|
||||||
Colors mColors {};
|
Colors mColors {};
|
||||||
Indices mIndices {};
|
Indices mIndices {};
|
||||||
|
@ -161,6 +186,7 @@ namespace Qtk {
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
friend MeshRenderer;
|
friend MeshRenderer;
|
||||||
|
|
||||||
friend Object;
|
friend Object;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -175,30 +201,45 @@ namespace Qtk {
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Vertex data to use for this shape.
|
||||||
|
*/
|
||||||
virtual inline void setVertices(const Vertices & value) {
|
virtual inline void setVertices(const Vertices & value) {
|
||||||
mVertices = value;
|
mVertices = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Index data to use for this shape.
|
||||||
|
*/
|
||||||
virtual inline void setIndices(const Indices & value) {
|
virtual inline void setIndices(const Indices & value) {
|
||||||
mIndices = value;
|
mIndices = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Color data to use for this shape.
|
||||||
|
*/
|
||||||
virtual inline void setColors(const Colors & value) { mColors = value; }
|
virtual inline void setColors(const Colors & value) { mColors = value; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Texture coordinates to use for this shape.
|
||||||
|
*/
|
||||||
virtual inline void setTexCoords(const TexCoords & value) {
|
virtual inline void setTexCoords(const TexCoords & value) {
|
||||||
mTexCoords = value;
|
mTexCoords = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Normals to use for this shape.
|
||||||
|
*/
|
||||||
virtual inline void setNormals(const Normals & value) {
|
virtual inline void setNormals(const Normals & value) {
|
||||||
mNormals = value;
|
mNormals = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value Shape to copy into this Shape.
|
||||||
|
*/
|
||||||
virtual inline void setShape(const Shape & value) { *this = value; }
|
virtual inline void setShape(const Shape & value) { *this = value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Primitives inherit from ShapeBase, doesn't allow setting shape values. */
|
|
||||||
class QTKAPI Mesh {};
|
|
||||||
|
|
||||||
/* Simple Cube shape. */
|
/* Simple Cube shape. */
|
||||||
struct QTKAPI Cube : public ShapeBase {
|
struct QTKAPI Cube : public ShapeBase {
|
||||||
explicit Cube(DrawMode mode = QTK_DRAW_ARRAYS);
|
explicit Cube(DrawMode mode = QTK_DRAW_ARRAYS);
|
||||||
|
@ -210,4 +251,4 @@ namespace Qtk {
|
||||||
};
|
};
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
#endif // QTK_MESH_H
|
#endif // QTK_SHAPE_H
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Skybox class using QtOpenGL ##
|
## About: Skybox class using QtOpenGL ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -12,6 +12,20 @@
|
||||||
|
|
||||||
using namespace Qtk;
|
using namespace Qtk;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Constructors / Destructors
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
Skybox::Skybox(const std::string & name) :
|
||||||
|
Skybox(
|
||||||
|
":/right.png", ":/top.png", ":/front.png", ":/left.png", ":/bottom.png",
|
||||||
|
":/back.png", name) {}
|
||||||
|
|
||||||
|
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name) {
|
||||||
|
mTexture.setTexture(cubeMap);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
Skybox::Skybox(
|
Skybox::Skybox(
|
||||||
const std::string & right, const std::string & top,
|
const std::string & right, const std::string & top,
|
||||||
const std::string & front, const std::string & left,
|
const std::string & front, const std::string & left,
|
||||||
|
@ -27,16 +41,6 @@ Skybox::Skybox(
|
||||||
QImage(back.c_str()));
|
QImage(back.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Skybox::Skybox(const std::string & name) :
|
|
||||||
Skybox(
|
|
||||||
":/right.png", ":/top.png", ":/front.png", ":/left.png", ":/bottom.png",
|
|
||||||
":/back.png", name) {}
|
|
||||||
|
|
||||||
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name) {
|
|
||||||
mTexture.setTexture(cubeMap);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Public Member Functions
|
* Public Member Functions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Skybox class using QtOpenGL ##
|
## About: Skybox class using QtOpenGL ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -16,8 +16,8 @@
|
||||||
#include <QOpenGLVertexArrayObject>
|
#include <QOpenGLVertexArrayObject>
|
||||||
|
|
||||||
#include "camera3d.h"
|
#include "camera3d.h"
|
||||||
#include "mesh.h"
|
|
||||||
#include "qtkapi.h"
|
#include "qtkapi.h"
|
||||||
|
#include "shape.h"
|
||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
|
@ -33,11 +33,35 @@ namespace Qtk {
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Delegate this constructor to use default skybox images
|
// Delegate this constructor to use default skybox images
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct Skybox using default images.
|
||||||
|
*
|
||||||
|
* @param name The objectName to use for the Skybox.
|
||||||
|
*/
|
||||||
explicit Skybox(const std::string & name = "Skybox");
|
explicit Skybox(const std::string & name = "Skybox");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a skybox with an existing QOpenGLTexture.
|
||||||
|
* The texture should be a fully initialized cube map.
|
||||||
|
*
|
||||||
|
* @param cubeMap QOpenGLTexture to use for the new Skybox.
|
||||||
|
* @param name The objectName to use for the Skybox.
|
||||||
|
*/
|
||||||
explicit Skybox(
|
explicit Skybox(
|
||||||
QOpenGLTexture * cubeMap, const std::string & name = "Skybox");
|
QOpenGLTexture * cubeMap, const std::string & name = "Skybox");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Skybox.
|
||||||
|
*
|
||||||
|
* @param right Image to use for the right side of the Skybox.
|
||||||
|
* @param top Image to use for the top side of the Skybox.
|
||||||
|
* @param front Image to use for the front side of the Skybox.
|
||||||
|
* @param left Image to use for the left side of the Skybox.
|
||||||
|
* @param bottom Image to use for the bottom side of the Skybox.
|
||||||
|
* @param back Image to use for the back side of the Skybox.
|
||||||
|
* @param name The objectName to use for this Skybox.
|
||||||
|
*/
|
||||||
Skybox(
|
Skybox(
|
||||||
const std::string & right, const std::string & top,
|
const std::string & right, const std::string & top,
|
||||||
const std::string & front, const std::string & left,
|
const std::string & front, const std::string & left,
|
||||||
|
@ -50,6 +74,9 @@ namespace Qtk {
|
||||||
* Public Methods
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws the skybox.
|
||||||
|
*/
|
||||||
void draw();
|
void draw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -57,6 +84,9 @@ namespace Qtk {
|
||||||
* Private Methods
|
* Private Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes OpenGL buffers and shaders for this skybox.
|
||||||
|
*/
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Texture class to help with texture and image initializations ##
|
## About: Texture class to help with texture and image initializations ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QImageReader>
|
#include <QImageReader>
|
||||||
|
|
||||||
|
@ -59,9 +57,7 @@ QOpenGLTexture * OpenGLTextureFactory::initCubeMap(
|
||||||
const QImage & right, const QImage & top, const QImage & front,
|
const QImage & right, const QImage & top, const QImage & front,
|
||||||
const QImage & left, const QImage & bottom, const QImage & back) {
|
const QImage & left, const QImage & bottom, const QImage & back) {
|
||||||
auto texture = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
|
auto texture = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
|
||||||
std::vector<QImage> faceTextures = {std::move(right), std::move(top),
|
std::vector<QImage> faceTextures = {right, top, front, left, bottom, back};
|
||||||
std::move(front), std::move(left),
|
|
||||||
std::move(bottom), std::move(back)};
|
|
||||||
// Initialize skybox cubemap texture
|
// Initialize skybox cubemap texture
|
||||||
texture->create();
|
texture->create();
|
||||||
texture->bind();
|
texture->bind();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Texture class to help with texture and image initializations ##
|
## About: Texture class to help with texture and image initializations ##
|
||||||
## ##
|
## ##
|
||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
@ -156,52 +156,109 @@ namespace Qtk {
|
||||||
|
|
||||||
Texture() = default;
|
Texture() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies an existing Texture object.
|
||||||
|
*
|
||||||
|
* @param value Texture to copy.
|
||||||
|
*/
|
||||||
Texture(const Texture & value) {
|
Texture(const Texture & value) {
|
||||||
mOpenGLTexture = OpenGLTextureFactory::initTexture(value.mPath);
|
mOpenGLTexture = OpenGLTextureFactory::initTexture(value.mPath);
|
||||||
mPath = value.mPath;
|
mPath = value.mPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path Path to texture to load on disk.
|
||||||
|
* @param flipX True if texture is to be flipped on the X axis.
|
||||||
|
* @param flipY True if texture is to be flipped on the Y axis.
|
||||||
|
*/
|
||||||
explicit Texture(
|
explicit Texture(
|
||||||
const char * path, bool flipX = false, bool flipY = false) :
|
const char * path, bool flipX = false, bool flipY = false) :
|
||||||
mOpenGLTexture(OpenGLTextureFactory::initTexture(path, flipX, flipY)),
|
mOpenGLTexture(OpenGLTextureFactory::initTexture(path, flipX, flipY)),
|
||||||
mPath(path) {}
|
mPath(path) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Texture using an existing QOpenGLTexture.
|
||||||
|
*
|
||||||
|
* @param texture OpenGL texture to use for this Texture.
|
||||||
|
*/
|
||||||
explicit Texture(QOpenGLTexture * texture) : mOpenGLTexture(texture) {}
|
explicit Texture(QOpenGLTexture * texture) : mOpenGLTexture(texture) {}
|
||||||
|
|
||||||
~Texture() { mOpenGLTexture->destroy(); }
|
~Texture() { mOpenGLTexture->destroy(); }
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Public Methods
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return True if the OpenGL texture has been initialized.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] inline bool hasTexture() const {
|
||||||
|
return mOpenGLTexture != Q_NULLPTR;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return QOpenGLTexture associated with this Texture.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline QOpenGLTexture & getOpenGLTexture() const {
|
[[nodiscard]] inline QOpenGLTexture & getOpenGLTexture() const {
|
||||||
return *mOpenGLTexture;
|
return *mOpenGLTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Path to this Texture on disk.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline std::string getPath() const { return mPath; }
|
[[nodiscard]] inline std::string getPath() const { return mPath; }
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
void setTexture(
|
/**
|
||||||
|
* Replaces the current texture with a new texture.
|
||||||
|
*
|
||||||
|
* @param path Path to the new texture to load.
|
||||||
|
* @param flipX True if texture is to be flipped on the X axis.
|
||||||
|
* @param flipY True if texture is to be flipped on the Y axis.
|
||||||
|
*/
|
||||||
|
inline void setTexture(
|
||||||
const std::string & path, bool flipX = false, bool flipY = false) {
|
const std::string & path, bool flipX = false, bool flipY = false) {
|
||||||
mOpenGLTexture =
|
setTexture(path.c_str(), flipX, flipY);
|
||||||
OpenGLTextureFactory::initTexture(path.data(), flipX, flipY);
|
|
||||||
mPath = path.data();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTexture(
|
/**
|
||||||
|
* @param path Path to the new texture to load.
|
||||||
|
* @param flipX True if texture is to be flipped on the X axis.
|
||||||
|
* @param flipY True if texture is to be flipped on the Y axis.
|
||||||
|
*/
|
||||||
|
inline void setTexture(
|
||||||
const char * path, bool flipX = false, bool flipY = false) {
|
const char * path, bool flipX = false, bool flipY = false) {
|
||||||
mOpenGLTexture = OpenGLTextureFactory::initTexture(path, flipX, flipY);
|
mOpenGLTexture = OpenGLTextureFactory::initTexture(path, flipX, flipY);
|
||||||
mPath = path;
|
mPath = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets this Texture to be a cube map with all identical sides.
|
||||||
|
*
|
||||||
|
* @param path Path to texture to use for all sides of the cube map.
|
||||||
|
*/
|
||||||
virtual inline void setCubeMap(const char * path) {
|
virtual inline void setCubeMap(const char * path) {
|
||||||
mOpenGLTexture = OpenGLTextureFactory::initCubeMap(path);
|
mOpenGLTexture = OpenGLTextureFactory::initCubeMap(path);
|
||||||
mPath = path;
|
mPath = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets this Texture to be a cube map with provided sides.
|
||||||
|
*
|
||||||
|
* @param right Path to texture to use for right cube map side.
|
||||||
|
* @param top Path to texture to use for top cube map side.
|
||||||
|
* @param front Path to texture to use for front cube map side.
|
||||||
|
* @param left Path to texture to use for left cube map side.
|
||||||
|
* @param bottom Path to texture to use for bottom cube map side.
|
||||||
|
* @param back Path to texture to use for back cube map side.
|
||||||
|
*/
|
||||||
virtual inline void setCubeMap(
|
virtual inline void setCubeMap(
|
||||||
const char * right, const char * top, const char * front,
|
const char * right, const char * top, const char * front,
|
||||||
const char * left, const char * bottom, const char * back) {
|
const char * left, const char * bottom, const char * back) {
|
||||||
|
@ -209,6 +266,16 @@ namespace Qtk {
|
||||||
right, top, front, left, bottom, back);
|
right, top, front, left, bottom, back);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets this Texture to be a cube map with provided sides.
|
||||||
|
*
|
||||||
|
* @param right Path to texture to use for right cube map side.
|
||||||
|
* @param top Path to texture to use for top cube map side.
|
||||||
|
* @param front Path to texture to use for front cube map side.
|
||||||
|
* @param left Path to texture to use for left cube map side.
|
||||||
|
* @param bottom Path to texture to use for bottom cube map side.
|
||||||
|
* @param back Path to texture to use for back cube map side.
|
||||||
|
*/
|
||||||
virtual inline void setCubeMap(
|
virtual inline void setCubeMap(
|
||||||
const QImage & right, const QImage & top, const QImage & front,
|
const QImage & right, const QImage & top, const QImage & front,
|
||||||
const QImage & left, const QImage & bottom, const QImage & back) {
|
const QImage & left, const QImage & bottom, const QImage & back) {
|
||||||
|
@ -216,18 +283,14 @@ namespace Qtk {
|
||||||
right, top, front, left, bottom, back);
|
right, top, front, left, bottom, back);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Public Methods
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool hasTexture() const {
|
|
||||||
return mOpenGLTexture != Q_NULLPTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param texture QOpenGLTexture to use for this Texture.
|
||||||
|
*/
|
||||||
inline void setTexture(QOpenGLTexture * texture) {
|
inline void setTexture(QOpenGLTexture * texture) {
|
||||||
mOpenGLTexture = texture;
|
mOpenGLTexture = texture;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +299,6 @@ namespace Qtk {
|
||||||
/* Path to this texture on disk or Qt resource. */
|
/* Path to this texture on disk or Qt resource. */
|
||||||
const char * mPath {};
|
const char * mPath {};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Qtk
|
} // namespace Qtk
|
||||||
|
|
||||||
#endif // QTOPENGL_TEXTURE_H
|
#endif // QTOPENGL_TEXTURE_H
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Transform3D class to represent object position in 3D space ##
|
## About: Transform3D class to represent object position in 3D space ##
|
||||||
## From following tutorials at trentreed.net ##
|
## From following tutorials at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
|
@ -16,7 +16,7 @@ const QVector3D Transform3D::LocalUp(0.0f, 1.0f, 0.0f);
|
||||||
const QVector3D Transform3D::LocalRight(1.0f, 0.0f, 0.0f);
|
const QVector3D Transform3D::LocalRight(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Transformations
|
* Public Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void Transform3D::translate(const QVector3D & dt) {
|
void Transform3D::translate(const QVector3D & dt) {
|
||||||
|
@ -29,19 +29,16 @@ void Transform3D::scale(const QVector3D & ds) {
|
||||||
mScale *= ds;
|
mScale *= ds;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform3D::rotate(const QQuaternion & dr) {
|
|
||||||
m_dirty = true;
|
|
||||||
mRotation = dr * mRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Transform3D::grow(const QVector3D & ds) {
|
void Transform3D::grow(const QVector3D & ds) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
mScale += ds;
|
mScale += ds;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
void Transform3D::rotate(const QQuaternion & dr) {
|
||||||
* Setters
|
m_dirty = true;
|
||||||
******************************************************************************/
|
mRotation = dr * mRotation;
|
||||||
|
}
|
||||||
|
|
||||||
void Transform3D::setTranslation(const QVector3D & t) {
|
void Transform3D::setTranslation(const QVector3D & t) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
@ -58,12 +55,6 @@ void Transform3D::setRotation(const QQuaternion & r) {
|
||||||
mRotation = r;
|
mRotation = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Accessors
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
// Produces modelToWorld matrix using current set of transformations
|
|
||||||
// Transformation * rotation * scale = modelToWorld
|
|
||||||
const QMatrix4x4 & Transform3D::toMatrix() {
|
const QMatrix4x4 & Transform3D::toMatrix() {
|
||||||
if(m_dirty) {
|
if(m_dirty) {
|
||||||
m_dirty = false;
|
m_dirty = false;
|
||||||
|
@ -75,10 +66,6 @@ const QMatrix4x4 & Transform3D::toMatrix() {
|
||||||
return mWorld;
|
return mWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Queries
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
QVector3D Transform3D::getForward() const {
|
QVector3D Transform3D::getForward() const {
|
||||||
return mRotation.rotatedVector(LocalForward);
|
return mRotation.rotatedVector(LocalForward);
|
||||||
}
|
}
|
||||||
|
@ -89,13 +76,10 @@ QVector3D Transform3D::getUp() const {
|
||||||
|
|
||||||
QVector3D Transform3D::getRight() const {
|
QVector3D Transform3D::getRight() const {
|
||||||
return mRotation.rotatedVector(LocalRight);
|
return mRotation.rotatedVector(LocalRight);
|
||||||
while(true) {
|
|
||||||
int xx;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* QT Streams
|
* Private Methods
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
namespace Qtk {
|
namespace Qtk {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*##############################################################################
|
/*##############################################################################
|
||||||
## Author: Shaun Reed ##
|
## Author: Shaun Reed ##
|
||||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||||
## About: Transform3D class to represent object position in 3D space ##
|
## About: Transform3D class to represent object position in 3D space ##
|
||||||
## From following tutorials at trentreed.net ##
|
## From following tutorials at trentreed.net ##
|
||||||
## ##
|
## ##
|
||||||
|
@ -35,75 +35,154 @@ namespace Qtk {
|
||||||
mTranslation(0.0f, 0.0f, 0.0f) {}
|
mTranslation(0.0f, 0.0f, 0.0f) {}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Transformations
|
* Public Methods
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param dt Translation from last to current position.
|
||||||
|
*/
|
||||||
void translate(const QVector3D & dt);
|
void translate(const QVector3D & dt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param dx X translation from last to current position.
|
||||||
|
* @param dy Y translation from last to current position.
|
||||||
|
* @param dz Z translation from last to current position.
|
||||||
|
*/
|
||||||
inline void translate(float dx, float dy, float dz) {
|
inline void translate(float dx, float dy, float dz) {
|
||||||
translate(QVector3D(dx, dy, dz));
|
translate(QVector3D(dx, dy, dz));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scale object with multiplication
|
/**
|
||||||
|
* Scale the object size.
|
||||||
|
*
|
||||||
|
* @param ds Scalar vector to apply to the transform.
|
||||||
|
*/
|
||||||
void scale(const QVector3D & ds);
|
void scale(const QVector3D & ds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scale the object size.
|
||||||
|
*
|
||||||
|
* @param dx Amount to scale on the X axis.
|
||||||
|
* @param dy Amount to scale on the Y axis.
|
||||||
|
* @param dz Amount to scale on the Z axis.
|
||||||
|
*/
|
||||||
inline void scale(float dx, float dy, float dz) {
|
inline void scale(float dx, float dy, float dz) {
|
||||||
scale(QVector3D(dx, dy, dz));
|
scale(QVector3D(dx, dy, dz));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scale the object size.
|
||||||
|
*
|
||||||
|
* @param factor Scalar to apply to all axis of the object.
|
||||||
|
*/
|
||||||
inline void scale(float factor) {
|
inline void scale(float factor) {
|
||||||
scale(QVector3D(factor, factor, factor));
|
scale(QVector3D(factor, factor, factor));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multiplying by a rotation
|
/**
|
||||||
void rotate(const QQuaternion & dr);
|
* @param ds 3D vector to add to scale axis.
|
||||||
|
*/
|
||||||
inline void rotate(float angle, const QVector3D & axis) {
|
|
||||||
rotate(QQuaternion::fromAxisAndAngle(axis, angle));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void rotate(float angle, float ax, float ay, float az) {
|
|
||||||
rotate(QQuaternion::fromAxisAndAngle(ax, ay, az, angle));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale object by addition
|
|
||||||
void grow(const QVector3D & ds);
|
void grow(const QVector3D & ds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param dx Amount to grow X axis.
|
||||||
|
* @param dy Amount to grow Y axis.
|
||||||
|
* @param dz Amount to grow Z axis.
|
||||||
|
*/
|
||||||
inline void grow(float dx, float dy, float dz) {
|
inline void grow(float dx, float dy, float dz) {
|
||||||
grow(QVector3D(dx, dy, dz));
|
grow(QVector3D(dx, dy, dz));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param factor Amount to grow all axis equally.
|
||||||
|
*/
|
||||||
inline void grow(float factor) {
|
inline void grow(float factor) {
|
||||||
grow(QVector3D(factor, factor, factor));
|
grow(QVector3D(factor, factor, factor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param dr Rotation to apply to the transform.
|
||||||
|
*/
|
||||||
|
void rotate(const QQuaternion & dr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param angle Angle to rotate.
|
||||||
|
* @param axis Axis to rotate apply the rotation on.
|
||||||
|
*/
|
||||||
|
inline void rotate(float angle, const QVector3D & axis) {
|
||||||
|
rotate(QQuaternion::fromAxisAndAngle(axis, angle));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply rotation upon an axis represented by the 3D vector (x, y, z)
|
||||||
|
*
|
||||||
|
* @param angle Angle to rotate.
|
||||||
|
* @param ax X axis to apply the rotation on.
|
||||||
|
* @param ay Y axis to apply the rotation on.
|
||||||
|
* @param az Z axis to apply the rotation on.
|
||||||
|
*/
|
||||||
|
inline void rotate(float angle, float ax, float ay, float az) {
|
||||||
|
rotate(QQuaternion::fromAxisAndAngle(ax, ay, az, angle));
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Setters
|
* Setters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Set object position
|
/**
|
||||||
|
* @param t Position to move the transform to.
|
||||||
|
*/
|
||||||
void setTranslation(const QVector3D & t);
|
void setTranslation(const QVector3D & t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param x X position to set transform.
|
||||||
|
* @param y Y position to set transform.
|
||||||
|
* @param z Z position to set transform.
|
||||||
|
*/
|
||||||
inline void setTranslation(float x, float y, float z) {
|
inline void setTranslation(float x, float y, float z) {
|
||||||
setTranslation(QVector3D(x, y, z));
|
setTranslation(QVector3D(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set object scale
|
/**
|
||||||
|
* @param s Scale to set for this transform.
|
||||||
|
*/
|
||||||
void setScale(const QVector3D & s);
|
void setScale(const QVector3D & s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param x X axis scale to set for this transform.
|
||||||
|
* @param y Y axis scale to set for this transform.
|
||||||
|
* @param z Z axis scale to set for this transform.
|
||||||
|
*/
|
||||||
inline void setScale(float x, float y, float z) {
|
inline void setScale(float x, float y, float z) {
|
||||||
setScale(QVector3D(x, y, z));
|
setScale(QVector3D(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param k Scale to set for all axis on this transform.
|
||||||
|
*/
|
||||||
inline void setScale(float k) { setScale(QVector3D(k, k, k)); }
|
inline void setScale(float k) { setScale(QVector3D(k, k, k)); }
|
||||||
|
|
||||||
// Set object rotation
|
/**
|
||||||
|
* @param r Rotation to set for this transform.
|
||||||
|
*/
|
||||||
void setRotation(const QQuaternion & r);
|
void setRotation(const QQuaternion & r);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param angle Angle to set for rotation.
|
||||||
|
* @param axis Axis to set rotation for.
|
||||||
|
*/
|
||||||
inline void setRotation(float angle, const QVector3D & axis) {
|
inline void setRotation(float angle, const QVector3D & axis) {
|
||||||
setRotation(QQuaternion::fromAxisAndAngle(axis, angle));
|
setRotation(QQuaternion::fromAxisAndAngle(axis, angle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a rotation upon an axis represented by the 3D vector (x, y, z)
|
||||||
|
*
|
||||||
|
* @param angle Angle to set rotation.
|
||||||
|
* @param ax X axis to set angle for.
|
||||||
|
* @param ay Y axis to set angle for.
|
||||||
|
* @param az Z axis to set angle for.
|
||||||
|
*/
|
||||||
inline void setRotation(float angle, float ax, float ay, float az) {
|
inline void setRotation(float angle, float ax, float ay, float az) {
|
||||||
setRotation(QQuaternion::fromAxisAndAngle(ax, ay, az, angle));
|
setRotation(QQuaternion::fromAxisAndAngle(ax, ay, az, angle));
|
||||||
}
|
}
|
||||||
|
@ -112,31 +191,55 @@ namespace Qtk {
|
||||||
* Getters
|
* Getters
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Translation for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const QVector3D & getTranslation() const {
|
[[nodiscard]] inline const QVector3D & getTranslation() const {
|
||||||
return mTranslation;
|
return mTranslation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Scale for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const QVector3D & getScale() const { return mScale; }
|
[[nodiscard]] inline const QVector3D & getScale() const { return mScale; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Rotation for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] inline const QQuaternion & getRotation() const {
|
[[nodiscard]] inline const QQuaternion & getRotation() const {
|
||||||
return mRotation;
|
return mRotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Model to world matrix for this transform.
|
||||||
|
* transformation * rotation * scale = ModelToWorld
|
||||||
|
*/
|
||||||
const QMatrix4x4 & toMatrix();
|
const QMatrix4x4 & toMatrix();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Forward vector for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] QVector3D getForward() const;
|
[[nodiscard]] QVector3D getForward() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Up vector for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] QVector3D getUp() const;
|
[[nodiscard]] QVector3D getUp() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Right vector for this transform.
|
||||||
|
*/
|
||||||
[[nodiscard]] QVector3D getRight() const;
|
[[nodiscard]] QVector3D getRight() const;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Public members
|
* Public Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
static const QVector3D LocalForward, LocalUp, LocalRight;
|
static const QVector3D LocalForward, LocalUp, LocalRight;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Private members
|
* Private Members
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
QVector3D mTranslation;
|
QVector3D mTranslation;
|
||||||
|
@ -154,7 +257,6 @@ namespace Qtk {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// Qt Streams
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const Transform3D & transform);
|
QDebug operator<<(QDebug dbg, const Transform3D & transform);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue