Improve UI #13
|
@ -74,7 +74,7 @@ We can install this library on a system path or a custom path and then set `CMAK
|
|||
Below is an example of installing on a system path.
|
||||
|
||||
```bash
|
||||
cmake -S qtk/ -B qtk/build/ -DCMAKE_PREFIX_PATH=$HOME/Qt/6.5.0/gcc_64 -DQTK_INSTALL_GUI=OFF -DQTK_INSTALL_PLUGINS=OFF
|
||||
cmake -S qtk/ -B qtk/build/ -DCMAKE_PREFIX_PATH=$HOME/Qt/6.5.0/gcc_64 -DQTK_INSTALL_GUI=OFF -DQTK_INSTALL_PLUGINS=OFF -DQTK_DEBUG=OFF
|
||||
cmake --build qtk/build/ -j $(nproc --ignore=2)
|
||||
sudo cmake --install . --prefix=/usr/local
|
||||
-- Install configuration: "Release"
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/QtkTargets.cmake")
|
||||
|
||||
set_and_check(QTK_EXECUTABLE "${PACKAGE_PREFIX_DIR}/bin/qtk_main")
|
||||
set_and_check(QTK_EXECUTABLE "${PACKAGE_PREFIX_DIR}/bin/qtk_app")
|
||||
set_and_check(QTK_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")
|
||||
set_and_check(QTK_LIBRARIES "${PACKAGE_PREFIX_DIR}/lib")
|
||||
|
||||
|
|
|
@ -65,6 +65,6 @@ set(
|
|||
examplewidget.cpp examplewidget.h
|
||||
)
|
||||
|
||||
add_executable(example ${EXAMPLE_SOURCES})
|
||||
target_link_libraries(example PUBLIC Qt6::Widgets Qt6::OpenGLWidgets Qt6::Core)
|
||||
target_link_libraries(example PUBLIC Qtk::qtk_library)
|
||||
add_executable(example_app ${EXAMPLE_SOURCES})
|
||||
target_link_libraries(example_app PUBLIC Qt6::Widgets Qt6::OpenGLWidgets Qt6::Core)
|
||||
target_link_libraries(example_app PUBLIC Qtk::qtk_library)
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
|
||||
This is an example application that is using the Qtk API to create custom Qt
|
||||
OpenGL widgets. This is very similar to `QtkWidget` in the Qtk desktop
|
||||
application, but could be modified for different uses if needed.
|
||||
application source code, but could be modified for different uses if needed.
|
||||
|
||||
There are no camera controls supported in this example. The camera is fixed.
|
||||
If these controls are desired, they can be implemented by the client.
|
||||
|
||||
You can import your own models within `examplescene.cpp`, inside the
|
||||
`ExampleScene::init()` function. Rotations and translations
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
using namespace Qtk;
|
||||
|
||||
ExampleScene::ExampleScene() {
|
||||
ExampleScene::ExampleScene(Qtk::Scene * scene) : Qtk::SceneInterface(scene) {
|
||||
setSceneName("Example Scene");
|
||||
getCamera().getTransform().setTranslation(-8.0f, 0.0f, 10.0f);
|
||||
getCamera().getTransform().setRotation(-5.0f, 0.0f, 1.0f, 0.0f);
|
||||
|
|
|
@ -11,9 +11,9 @@
|
|||
|
||||
#include <qtk/scene.h>
|
||||
|
||||
class ExampleScene : public Qtk::Scene {
|
||||
class ExampleScene : public Qtk::SceneInterface {
|
||||
public:
|
||||
ExampleScene();
|
||||
ExampleScene(Qtk::Scene * scene);
|
||||
|
||||
~ExampleScene();
|
||||
|
||||
|
|
|
@ -11,7 +11,12 @@
|
|||
#include "examplewidget.h"
|
||||
|
||||
ExampleWidget::ExampleWidget(QWidget * parent) :
|
||||
QOpenGLWidget(parent), mScene(new ExampleScene) {
|
||||
QOpenGLWidget(parent), mScene(new ExampleScene(new Qtk::SceneEmpty)) {
|
||||
// NOTE: The decorator pattern is used to save / load scenes in Qtk currently.
|
||||
// The initializer above sets mScene to the concrete decorator ExampleScene.
|
||||
// Qtk::SceneEmpty provides an empty scene as the concrete component.
|
||||
// ExampleScene is defined in client source, deriving Qtk::SceneInterface.
|
||||
|
||||
QSurfaceFormat format;
|
||||
format.setRenderableType(QSurfaceFormat::OpenGL);
|
||||
format.setProfile(QSurfaceFormat::CoreProfile);
|
||||
|
|
|
@ -32,7 +32,7 @@ class ExampleWidget : public QOpenGLWidget, protected QOpenGLFunctions {
|
|||
void update();
|
||||
|
||||
private:
|
||||
ExampleScene * mScene;
|
||||
Qtk::Scene * mScene;
|
||||
};
|
||||
|
||||
#endif // QTKCLIENT_EXAMPLEWIDGET_H
|
||||
|
|
|
@ -32,7 +32,7 @@ if (QTK_INSTALL_GUI OR QTK_INSTALL_PLUGINS)
|
|||
|
||||
if(QTK_INSTALL_GUI)
|
||||
install(
|
||||
TARGETS qtk_main qtk_library
|
||||
TARGETS qtk_app qtk_library
|
||||
COMPONENT qtk
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION lib
|
||||
|
@ -41,7 +41,7 @@ if (QTK_INSTALL_GUI OR QTK_INSTALL_PLUGINS)
|
|||
)
|
||||
|
||||
qt_generate_deploy_app_script(
|
||||
TARGET qtk_main
|
||||
TARGET qtk_app
|
||||
OUTPUT_SCRIPT QTK_DEPLOY_SCRIPT
|
||||
NO_UNSUPPORTED_PLATFORM_ERROR
|
||||
)
|
||||
|
@ -58,7 +58,7 @@ if (QTK_INSTALL_GUI OR QTK_INSTALL_PLUGINS)
|
|||
)
|
||||
file(TO_NATIVE_PATH "${QT6_INSTALL_PREFIX}/bin" QT6_INSTALL_PREFIX)
|
||||
|
||||
set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk_main.vcxproj.user")
|
||||
set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk_app.vcxproj.user")
|
||||
file(WRITE ${VSUSER_FILE} "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
|
||||
file(APPEND ${VSUSER_FILE} "<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n")
|
||||
file(APPEND ${VSUSER_FILE} " <PropertyGroup>\n")
|
||||
|
@ -137,11 +137,11 @@ set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
|||
# https://nsis.sourceforge.io/Reference/CreateShortCut
|
||||
set(
|
||||
CPACK_NSIS_CREATE_ICONS_EXTRA
|
||||
"CreateShortCut '$SMPROGRAMS\\$STARTMENU_FOLDER\\Qtk.lnk' '$INSTDIR\\bin\\qtk_main.exe'"
|
||||
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_app.exe'"
|
||||
)
|
||||
set(
|
||||
CPACK_NSIS_DELETE_ICONS_EXTRA
|
||||
"Delete '$SMPROGRAMS\\$START_MENU\\Qtk.lnk'"
|
||||
"Delete '$SMPROGRAMS\\\\$START_MENU\\\\Qtk.lnk'"
|
||||
)
|
||||
# TODO: Icons for NSIS installer.
|
||||
#set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/resources/icon.png")
|
||||
|
@ -154,9 +154,8 @@ set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
|||
#set(CPACK_PACKAGING_INSTALL_PREFIX /usr/local/)
|
||||
|
||||
# OSX
|
||||
# TODO: Fix OSX appbundle error.
|
||||
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
|
||||
set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_main>/Info.plist)
|
||||
set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_app>/Info.plist)
|
||||
set(CPACK_BUNDLE_ICON ${QTK_OSX_ICONS})
|
||||
|
||||
# Platform defaults for source bundles.
|
||||
|
|
|
@ -50,7 +50,7 @@ target_link_libraries(qtk_collection PUBLIC qtk_plugin_library)
|
|||
|
||||
set(
|
||||
QTK_APP_SOURCES
|
||||
examplescene.cpp examplescene.h
|
||||
qtkscene.cpp qtkscene.h
|
||||
main.cpp
|
||||
)
|
||||
|
||||
|
@ -61,11 +61,11 @@ configure_file(
|
|||
@ONLY
|
||||
)
|
||||
|
||||
qt_add_executable(qtk_main ${QTK_APP_SOURCES})
|
||||
target_link_libraries(qtk_main PRIVATE qtk_plugin_library)
|
||||
qt_add_executable(qtk_app ${QTK_APP_SOURCES})
|
||||
target_link_libraries(qtk_app PRIVATE qtk_plugin_library)
|
||||
|
||||
set_target_properties(
|
||||
qtk_main PROPERTIES
|
||||
qtk_app PROPERTIES
|
||||
WIN32_EXECUTABLE TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
MACOSX_BUNDLE_BUNDLE_NAME Qtk
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <QApplication>
|
||||
|
||||
#include "qtkmainwindow.h"
|
||||
#include "qtkscene.h"
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
Q_INIT_RESOURCE(resources);
|
||||
|
@ -16,7 +17,12 @@ int main(int argc, char * argv[]) {
|
|||
QApplication a(argc, argv);
|
||||
|
||||
auto window = MainWindow::getMainWindow();
|
||||
window->show();
|
||||
|
||||
// Qtk currently uses the decorator pattern to save / load scenes.
|
||||
// This is a temporary solution and will be improved in the future.
|
||||
auto emptyScene = new Qtk::SceneEmpty;
|
||||
window->getQtkWidget()->setScene(new QtkScene(emptyScene));
|
||||
|
||||
window->show();
|
||||
return QApplication::exec();
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
##############################################################################*/
|
||||
|
||||
#include "qtkmainwindow.h"
|
||||
#include "examplescene.h"
|
||||
#include "qtkscene.h"
|
||||
#include "ui_qtkmainwindow.h"
|
||||
|
||||
MainWindow * MainWindow::mainWindow_ = Q_NULLPTR;
|
||||
|
@ -27,7 +27,7 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
|
|||
// Initialize static container for all active QtkWidgets
|
||||
auto qtkWidgets = findChildren<Qtk::QtkWidget *>();
|
||||
for(auto & qtkWidget : qtkWidgets) {
|
||||
qtkWidget->setScene(new ExampleScene);
|
||||
qtkWidget->setScene(new Qtk::SceneEmpty);
|
||||
views_.emplace(qtkWidget->getScene()->getSceneName(), qtkWidget);
|
||||
ui_->menuView->addAction(qtkWidget->getActionToggleConsole());
|
||||
connect(
|
||||
|
@ -60,6 +60,13 @@ MainWindow * MainWindow::getMainWindow() {
|
|||
return mainWindow_;
|
||||
}
|
||||
|
||||
Qtk::QtkWidget * MainWindow::getQtkWidget(int64_t index) {
|
||||
if(views_.size() <= index) {
|
||||
return Q_NULLPTR;
|
||||
}
|
||||
return views_.begin(index)->second;
|
||||
}
|
||||
|
||||
Qtk::QtkWidget * MainWindow::getQtkWidget(const QString & name) {
|
||||
if(!views_.count(name)) {
|
||||
return Q_NULLPTR;
|
||||
|
|
|
@ -53,6 +53,8 @@ class MainWindow : public QMainWindow {
|
|||
*/
|
||||
static MainWindow * getMainWindow();
|
||||
|
||||
Qtk::QtkWidget * getQtkWidget(int64_t index = 0);
|
||||
|
||||
/**
|
||||
* Accessor for retrieving a QtkWidget by it's objectName.
|
||||
* This function will not construct a new QtkWidget if none is found.
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include "examplescene.h"
|
||||
#include "qtkscene.h"
|
||||
#include "resources.h"
|
||||
|
||||
using namespace Qtk;
|
||||
|
@ -15,13 +15,14 @@ using namespace Qtk;
|
|||
* Constructors, Destructors
|
||||
******************************************************************************/
|
||||
|
||||
ExampleScene::ExampleScene() {
|
||||
setSceneName("Example Scene");
|
||||
QtkScene::QtkScene(Qtk::Scene * scene) :
|
||||
Qtk::SceneInterface(scene) {
|
||||
setSceneName("Qtk Scene");
|
||||
getCamera().getTransform().setTranslation(0.0f, 0.0f, 20.0f);
|
||||
getCamera().getTransform().setRotation(-5.0f, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
ExampleScene::~ExampleScene() {
|
||||
QtkScene::~QtkScene() {
|
||||
delete mTestPhong;
|
||||
delete mTestSpecular;
|
||||
delete mTestDiffuse;
|
||||
|
@ -32,7 +33,7 @@ ExampleScene::~ExampleScene() {
|
|||
* Public Member Functions
|
||||
******************************************************************************/
|
||||
|
||||
void ExampleScene::init() {
|
||||
void QtkScene::init() {
|
||||
// Add a skybox to the scene using default cube map images and settings.
|
||||
setSkybox(new Qtk::Skybox("Skybox"));
|
||||
|
||||
|
@ -97,7 +98,7 @@ void ExampleScene::init() {
|
|||
model->getTransform().scale(0.15f);
|
||||
|
||||
model =
|
||||
addObject(new Qtk::Model("scythe", ":/models/models/scythe/scythe.obj"));
|
||||
addObject(new Qtk::Model("My scythe", ":/models/models/scythe/scythe.obj"));
|
||||
model->getTransform().setTranslation(-6.0f, 0.0f, -10.0f);
|
||||
model->getTransform().rotate(-90.0f, 1.0f, 0.0f, 0.0f);
|
||||
model->getTransform().rotate(90.0f, 0.0f, 1.0f, 0.0f);
|
||||
|
@ -387,19 +388,11 @@ void ExampleScene::init() {
|
|||
mesh->reallocateTexCoords(mesh->getTexCoords());
|
||||
}
|
||||
|
||||
void ExampleScene::draw() {
|
||||
void QtkScene::draw() {
|
||||
// WARNING: We must call the base class draw() function first.
|
||||
// + This will handle rendering core scene components like the Skybox.
|
||||
Scene::draw();
|
||||
|
||||
for(const auto & model : getModels()) {
|
||||
model->draw();
|
||||
}
|
||||
|
||||
for(const auto & mesh : getMeshes()) {
|
||||
mesh->draw();
|
||||
}
|
||||
|
||||
mTestPhong->bindShaders();
|
||||
mTestPhong->setUniform(
|
||||
"uModelInverseTransposed",
|
||||
|
@ -409,14 +402,14 @@ void ExampleScene::draw() {
|
|||
MeshRenderer::getInstance("phongLight")->getTransform().getTranslation());
|
||||
mTestPhong->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
mTestPhong->releaseShaders();
|
||||
mTestPhong->draw();
|
||||
|
||||
mTestAmbient->bindShaders();
|
||||
mTestAmbient->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
mTestAmbient->releaseShaders();
|
||||
mTestAmbient->draw();
|
||||
|
||||
|
@ -430,7 +423,7 @@ void ExampleScene::draw() {
|
|||
.getTranslation());
|
||||
mTestDiffuse->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
mTestDiffuse->releaseShaders();
|
||||
mTestDiffuse->draw();
|
||||
|
||||
|
@ -444,12 +437,12 @@ void ExampleScene::draw() {
|
|||
.getTranslation());
|
||||
mTestSpecular->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
mTestSpecular->releaseShaders();
|
||||
mTestSpecular->draw();
|
||||
}
|
||||
|
||||
void ExampleScene::update() {
|
||||
void QtkScene::update() {
|
||||
auto mySpartan = Model::getInstance("My spartan");
|
||||
mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
|
@ -463,12 +456,12 @@ void ExampleScene::update() {
|
|||
alien->setUniform("uLight.position", position);
|
||||
alien->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
auto posMatrix = alien->getTransform().toMatrix();
|
||||
alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
alien->setUniform("uMVP.model", posMatrix);
|
||||
alien->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
|
||||
alien->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix());
|
||||
alien->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||
alien->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||
alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
position = MeshRenderer::getInstance("spartanTestLight")
|
||||
|
@ -478,12 +471,12 @@ void ExampleScene::update() {
|
|||
spartan->setUniform("uLight.position", position);
|
||||
spartan->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
posMatrix = spartan->getTransform().toMatrix();
|
||||
spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
spartan->setUniform("uMVP.model", posMatrix);
|
||||
spartan->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
|
||||
spartan->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix());
|
||||
spartan->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||
spartan->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||
spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
auto phong = MeshRenderer::getInstance("testPhong");
|
||||
|
@ -494,12 +487,12 @@ void ExampleScene::update() {
|
|||
phong->setUniform("uLight.position", position);
|
||||
phong->setUniform(
|
||||
"uCameraPosition",
|
||||
ExampleScene::getCamera().getTransform().getTranslation());
|
||||
QtkScene::getCamera().getTransform().getTranslation());
|
||||
posMatrix = phong->getTransform().toMatrix();
|
||||
phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
phong->setUniform("uMVP.model", posMatrix);
|
||||
phong->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
|
||||
phong->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix());
|
||||
phong->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||
phong->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||
phong->releaseShaders();
|
||||
|
||||
// Rotate lighting example cubes
|
|
@ -29,15 +29,15 @@
|
|||
*
|
||||
* To create your own Scene from scratch see Qtk::Scene.
|
||||
*/
|
||||
class ExampleScene : public Qtk::Scene {
|
||||
class QtkScene : public Qtk::SceneInterface {
|
||||
public:
|
||||
/***************************************************************************
|
||||
* Contructors / Destructors
|
||||
**************************************************************************/
|
||||
|
||||
ExampleScene();
|
||||
QtkScene(Qtk::Scene * scene);
|
||||
|
||||
~ExampleScene();
|
||||
~QtkScene();
|
||||
|
||||
/***************************************************************************
|
||||
* Inherited Public Overrides
|
|
@ -100,6 +100,13 @@ namespace Qtk {
|
|||
*/
|
||||
inline Qtk::Scene * getScene() { return mScene; }
|
||||
|
||||
/**
|
||||
* @return Pointer to the QOpenGLDebugLogger attached to this widget.
|
||||
*/
|
||||
inline QOpenGLDebugLogger * getOpenGLDebugLogger() {
|
||||
return mDebugLogger;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* Setters
|
||||
************************************************************************/
|
||||
|
|
|
@ -37,7 +37,7 @@ void Qtk::TreeView::updateView(const Qtk::Scene * scene) {
|
|||
mSceneName = scene->getSceneName();
|
||||
auto objects = scene->getObjects();
|
||||
for(const auto & object : objects) {
|
||||
auto item = new QTreeWidgetItem(QStringList(QString(object->getName())));
|
||||
auto item = new QTreeWidgetItem(QStringList(QString(object->getName().c_str())));
|
||||
ui->treeWidget->insertTopLevelItem(0, item);
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +48,10 @@ void Qtk::TreeView::itemFocus(QTreeWidgetItem * item, int column) {
|
|||
MainWindow::getMainWindow()->getQtkWidget(mSceneName)->getScene();
|
||||
auto & transform = scene->getCamera().getTransform();
|
||||
auto object = scene->getObject(name);
|
||||
if (object == Q_NULLPTR) {
|
||||
qDebug() << "Attempt to get non-existing object with name '" << name
|
||||
<< "'\n";
|
||||
}
|
||||
Transform3D * objectTransform;
|
||||
if(object->getType() == Object::QTK_MESH) {
|
||||
objectTransform = &dynamic_cast<MeshRenderer *>(object)->getTransform();
|
||||
|
|
|
@ -38,7 +38,7 @@ MeshRenderer::MeshRenderer(const char * name, const ShapeBase & shape) :
|
|||
}
|
||||
|
||||
MeshRenderer::~MeshRenderer() {
|
||||
sInstances.remove(mName);
|
||||
sInstances.remove(mName.c_str());
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
@ -96,7 +96,7 @@ void Model::loadModel(const std::string & path) {
|
|||
sortModelMeshes();
|
||||
|
||||
// Object finished loading, insert it into ModelManager
|
||||
mManager.insert(getName(), this);
|
||||
mManager.insert(getName().c_str(), this);
|
||||
}
|
||||
|
||||
void Model::processNode(aiNode * node, const aiScene * scene) {
|
||||
|
@ -200,7 +200,7 @@ ModelMesh Model::processMesh(aiMesh * mesh, const aiScene * scene) {
|
|||
textures.insert(textures.end(), normalMaps.begin(), normalMaps.end());
|
||||
}
|
||||
|
||||
return {vertices, indices, textures, mVertexShader, mFragmentShader};
|
||||
return {vertices, indices, textures, mVertexShader.c_str(), mFragmentShader.c_str()};
|
||||
}
|
||||
|
||||
ModelMesh::Textures Model::loadMaterialTextures(
|
||||
|
|
|
@ -58,7 +58,7 @@ namespace Qtk {
|
|||
loadModel(mModelPath);
|
||||
}
|
||||
|
||||
inline ~Model() override { mManager.remove(getName()); }
|
||||
inline ~Model() override { mManager.remove(getName().c_str()); }
|
||||
|
||||
/*************************************************************************
|
||||
* Public Methods
|
||||
|
@ -197,7 +197,7 @@ namespace Qtk {
|
|||
/** The directory this model and it's textures are stored. */
|
||||
std::string mDirectory {};
|
||||
/** File names for shaders and 3D model on disk. */
|
||||
const char *mVertexShader, *mFragmentShader, *mModelPath;
|
||||
std::string mVertexShader, mFragmentShader, mModelPath;
|
||||
};
|
||||
} // namespace Qtk
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ void ModelMesh::initMesh(const char * vert, const char * frag) {
|
|||
initializeOpenGLFunctions();
|
||||
|
||||
// Create VAO, VBO, EBO
|
||||
mVAO->create();
|
||||
bool status = mVAO->create();
|
||||
mVBO->create();
|
||||
mEBO->create();
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ namespace Qtk {
|
|||
return mShape.mVertices;
|
||||
}
|
||||
|
||||
[[nodiscard]] inline const char * getName() const { return mName; }
|
||||
[[nodiscard]] inline std::string getName() const { return mName; }
|
||||
|
||||
[[nodiscard]] inline const Type & getType() const { return mType; }
|
||||
|
||||
|
@ -160,7 +160,7 @@ namespace Qtk {
|
|||
Transform3D mTransform;
|
||||
Shape mShape;
|
||||
Texture mTexture;
|
||||
const char * mName;
|
||||
std::string mName;
|
||||
bool mBound;
|
||||
Type mType = QTK_OBJECT;
|
||||
};
|
||||
|
|
|
@ -37,6 +37,23 @@ Scene::~Scene() {
|
|||
* Public Methods
|
||||
******************************************************************************/
|
||||
|
||||
void Scene::draw() {
|
||||
if(!mInit) {
|
||||
initializeOpenGLFunctions();
|
||||
init();
|
||||
mInit = true;
|
||||
}
|
||||
if(mSkybox != Q_NULLPTR) {
|
||||
mSkybox->draw();
|
||||
}
|
||||
for(auto & model : mModels) {
|
||||
model->draw();
|
||||
}
|
||||
for(const auto & mesh : mMeshes) {
|
||||
mesh->draw();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Object *> Scene::getObjects() const {
|
||||
// All scene objects must inherit from Qtk::Object.
|
||||
std::vector<Object *> objects(mMeshes.begin(), mMeshes.end());
|
||||
|
@ -51,7 +68,7 @@ std::vector<Object *> Scene::getObjects() const {
|
|||
|
||||
Object * Scene::getObject(const QString & name) {
|
||||
for(auto object : getObjects()) {
|
||||
if(object->getName() == name) {
|
||||
if(object->getName() == name.toStdString()) {
|
||||
return object;
|
||||
}
|
||||
}
|
||||
|
@ -74,24 +91,3 @@ template <> Model * Scene::addObject(Model * object) {
|
|||
sceneUpdated(mSceneName);
|
||||
return object;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Private Methods
|
||||
******************************************************************************/
|
||||
|
||||
void Scene::privateDraw() {
|
||||
if(!mInit) {
|
||||
initializeOpenGLFunctions();
|
||||
init();
|
||||
mInit = true;
|
||||
}
|
||||
if(mSkybox != Q_NULLPTR) {
|
||||
mSkybox->draw();
|
||||
}
|
||||
for(auto & model : mModels) {
|
||||
model->draw();
|
||||
}
|
||||
for(const auto & mesh : mMeshes) {
|
||||
mesh->draw();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#define QTK_SCENE_H
|
||||
|
||||
#include <QMatrix4x4>
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "camera3d.h"
|
||||
|
@ -65,7 +66,7 @@ namespace Qtk {
|
|||
*
|
||||
* This function is only called when the widget is redrawn.
|
||||
*/
|
||||
virtual void draw() { privateDraw(); };
|
||||
virtual void draw();
|
||||
|
||||
/**
|
||||
* Function called to update the QOpenGLWidget. Does not trigger a redraw.
|
||||
|
@ -165,6 +166,7 @@ namespace Qtk {
|
|||
*/
|
||||
inline void setSceneName(QString name) { mSceneName = std::move(name); }
|
||||
|
||||
std::vector<Model *> mModels {};
|
||||
signals:
|
||||
/**
|
||||
* Signal thrown when the scene is modified by adding or removing objects.
|
||||
|
@ -175,16 +177,6 @@ namespace Qtk {
|
|||
void sceneUpdated(QString sceneName);
|
||||
|
||||
private:
|
||||
/*************************************************************************
|
||||
* Private Methods
|
||||
************************************************************************/
|
||||
|
||||
/**
|
||||
* Handles drawing members encapsulated by this base class.
|
||||
* Child classes do not need to draw these objects manually.
|
||||
*/
|
||||
void privateDraw();
|
||||
|
||||
/*************************************************************************
|
||||
* Private Members
|
||||
************************************************************************/
|
||||
|
@ -199,8 +191,33 @@ namespace Qtk {
|
|||
/* MeshRenderers used simple geometry. */
|
||||
std::vector<MeshRenderer *> mMeshes {};
|
||||
/* Models used for storing 3D models in the scene. */
|
||||
std::vector<Model *> mModels {};
|
||||
};
|
||||
|
||||
class SceneEmpty : public Scene {
|
||||
public:
|
||||
void init() override {
|
||||
setSceneName("Empty Scene");
|
||||
}
|
||||
|
||||
void draw() override { Scene::draw(); }
|
||||
|
||||
void update() override { Scene::update(); }
|
||||
};
|
||||
|
||||
class SceneInterface : public Scene {
|
||||
public:
|
||||
explicit SceneInterface(Scene * scene) : mScene(scene) {}
|
||||
|
||||
void init() override { mScene->init(); }
|
||||
|
||||
void draw() override { mScene->draw(); }
|
||||
|
||||
void update() override { mScene->update(); }
|
||||
|
||||
protected:
|
||||
Scene * mScene;
|
||||
};
|
||||
|
||||
} // namespace Qtk
|
||||
|
||||
#endif // QTK_SCENE_H
|
||||
|
|
Loading…
Reference in New Issue