Compare commits
3 Commits
675082ab83
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ed604eb655 | |||
| f40366cb8d | |||
| d827d02a15 |
@@ -1,10 +1,16 @@
|
|||||||
name: All Builds
|
name: Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
# Runs on tag so the release workflow can use its artifact.
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
QT_VERSION: 6.6.0
|
QT_VERSION: 6.6.0
|
||||||
|
|
||||||
@@ -96,6 +102,16 @@ jobs:
|
|||||||
cd build
|
cd build
|
||||||
cpack -C Release -G NSIS
|
cpack -C Release -G NSIS
|
||||||
|
|
||||||
|
- name: Upload logs on failure (WIN)
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Build-Logs
|
||||||
|
path: |
|
||||||
|
D:\a\qtk\qtk\build\packages\_CPack_Packages\win64\NSIS\NSISOutput.log
|
||||||
|
D:\a\qtk\qtk\build\CMakeFiles\CMakeOutput.log
|
||||||
|
D:\a\qtk\qtk\build\CMakeFiles\CMakeError.log
|
||||||
|
|
||||||
- name: Upload package artifacts (WIN)
|
- name: Upload package artifacts (WIN)
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -122,7 +138,7 @@ jobs:
|
|||||||
- name: Upload Qtk install directory
|
- name: Upload Qtk install directory
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: qtk-gui-${{ matrix.os }}-install
|
name: qtk-gui-${{ matrix.os }}-archive
|
||||||
path: install/*
|
path: install/*
|
||||||
|
|
||||||
# TODO: Enable after trimming resources.
|
# TODO: Enable after trimming resources.
|
||||||
@@ -182,13 +198,13 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Qtk Library
|
- name: Build Qtk Library
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cmake --build build/ --config Release --target qtk_library -- ${{ matrix.flags }}
|
run: cmake --build build/ --config Release --target qtk -- ${{ matrix.flags }}
|
||||||
|
|
||||||
# Packaging
|
# Packaging
|
||||||
|
|
||||||
- name: Install Qtk Library
|
- name: Install Qtk Library
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cmake --install build/ --config Release --prefix=$(pwd)/install --component qtk_library
|
run: cmake --install build/ --config Release --prefix=$(pwd)/install --component qtk
|
||||||
|
|
||||||
- name: Package Qtk Library
|
- name: Package Qtk Library
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -216,6 +232,16 @@ jobs:
|
|||||||
cd build
|
cd build
|
||||||
cpack -C Release -G NSIS
|
cpack -C Release -G NSIS
|
||||||
|
|
||||||
|
- name: Upload logs on failure (WIN)
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Build-Logs
|
||||||
|
path: |
|
||||||
|
D:\a\qtk\qtk\build\packages\_CPack_Packages\win64\NSIS\NSISOutput.log
|
||||||
|
D:\a\qtk\qtk\build\CMakeFiles\CMakeOutput.log
|
||||||
|
D:\a\qtk\qtk\build\CMakeFiles\CMakeError.log
|
||||||
|
|
||||||
- name: Upload package artifacts (WIN)
|
- name: Upload package artifacts (WIN)
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -243,7 +269,7 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: libqtk-${{ matrix.os }}-install
|
name: libqtk-${{ matrix.os }}-archive
|
||||||
path: install/*
|
path: install/*
|
||||||
|
|
||||||
Qtk-Plugins:
|
Qtk-Plugins:
|
||||||
@@ -334,3 +360,29 @@ jobs:
|
|||||||
- name: Build Qtk
|
- name: Build Qtk
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cmake --build build/ --config Release
|
run: cmake --build build/ --config Release
|
||||||
|
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
needs: [Qtk, Qtk-Library, Qtk-Plugins]
|
||||||
|
steps:
|
||||||
|
- name: Download Installer Artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
build/packages/*
|
||||||
|
install/*
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
id: create_release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
name: Qtk ${{ github.ref_name }}
|
||||||
|
draft: true
|
||||||
|
prerelease: false
|
||||||
|
generate_release_notes: true
|
||||||
|
files: |
|
||||||
|
build/packages/*
|
||||||
|
install/*
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
## 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 ##
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
cmake_minimum_required(VERSION 3.23)
|
cmake_minimum_required(VERSION 3.28)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Constants
|
# Constants
|
||||||
@@ -18,6 +18,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
set(CMAKE_MACOSX_BUNDLE ON)
|
set(CMAKE_MACOSX_BUNDLE ON)
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
set(CMAKE_AUTORCC_OPTIONS --binary)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(CMAKE_COMPILE_WARNING_AS_ERROR OFF)
|
set(CMAKE_COMPILE_WARNING_AS_ERROR OFF)
|
||||||
@@ -30,7 +31,7 @@ add_compile_options(-fPIC)
|
|||||||
################################################################################
|
################################################################################
|
||||||
project(
|
project(
|
||||||
#[[NAME]] Qtk
|
#[[NAME]] Qtk
|
||||||
VERSION 0.2
|
VERSION 0.3
|
||||||
DESCRIPTION "Qt OpenGL library and desktop application."
|
DESCRIPTION "Qt OpenGL library and desktop application."
|
||||||
LANGUAGES CXX C
|
LANGUAGES CXX C
|
||||||
)
|
)
|
||||||
@@ -47,18 +48,10 @@ include(GNUInstallDirs)
|
|||||||
################################################################################
|
################################################################################
|
||||||
option(QTK_DEBUG "Enable debugger" OFF)
|
option(QTK_DEBUG "Enable debugger" OFF)
|
||||||
option(QTK_SUBMODULES "Update external project (assimp) submodule" OFF)
|
option(QTK_SUBMODULES "Update external project (assimp) submodule" OFF)
|
||||||
option(QTK_GUI "Build the Qtk desktop application" ON)
|
|
||||||
option(QTK_PLUGINS "Install Qtk plugins to Qt Creator path." OFF)
|
|
||||||
option(QTK_EXAMPLE "Build the Qtk example desktop application" ON)
|
option(QTK_EXAMPLE "Build the Qtk example desktop application" ON)
|
||||||
option(QTK_CCACHE "Enable ccache" ON)
|
option(QTK_CCACHE "Enable ccache" ON)
|
||||||
|
|
||||||
if (QTK_CCACHE)
|
|
||||||
set(CMAKE_CXX_COMPILER_LAUNCHER ccache)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Install Qtk for use within Qt Creator projects only, instead of system-wide.
|
# Install Qtk for use within Qt Creator projects only, instead of system-wide.
|
||||||
option(QTK_PREFIX_QTCREATOR "Install Qtk to Qt Creator. Untested." OFF)
|
option(QTK_PREFIX_QTCREATOR "Install Qtk to Qt Creator. Untested." OFF)
|
||||||
|
|
||||||
# Option for bringing your own assimp installation; Otherwise not needed
|
# Option for bringing your own assimp installation; Otherwise not needed
|
||||||
# + If assimp is available system-wide we can just set QTK_SUBMODULES OFF
|
# + If assimp is available system-wide we can just set QTK_SUBMODULES OFF
|
||||||
option(
|
option(
|
||||||
@@ -67,6 +60,18 @@ option(
|
|||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Qtk Component Options
|
||||||
|
option(QTK_PLUGINS "Install Qtk plugins to Qt Designer path." OFF)
|
||||||
|
# Options for qtk_gui
|
||||||
|
option(QTK_GUI "Build the Qtk desktop application" ON)
|
||||||
|
option(QTK_GUI_SCENE
|
||||||
|
"Fetch model resources and build the GUI with an example scene." OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
if (QTK_CCACHE)
|
||||||
|
set(CMAKE_CXX_COMPILER_LAUNCHER ccache)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(QTK_DEBUG OR CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$")
|
if(QTK_DEBUG OR CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$")
|
||||||
set(QTK_DEBUG ON)
|
set(QTK_DEBUG ON)
|
||||||
set(CMAKE_BUILD_TYPE Debug)
|
set(CMAKE_BUILD_TYPE Debug)
|
||||||
@@ -79,7 +84,7 @@ endif()
|
|||||||
set(QT_INSTALL_DIR "$ENV{HOME}/Qt/6.5.0/gcc_64/lib/cmake" CACHE PATH "Path to Qt6 install.")
|
set(QT_INSTALL_DIR "$ENV{HOME}/Qt/6.5.0/gcc_64/lib/cmake" CACHE PATH "Path to Qt6 install.")
|
||||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")
|
||||||
endif ()
|
endif()
|
||||||
|
|
||||||
set(QTK_RESOURCES "${CMAKE_SOURCE_DIR}/resources")
|
set(QTK_RESOURCES "${CMAKE_SOURCE_DIR}/resources")
|
||||||
set(QTK_OSX_ICONS ${CMAKE_SOURCE_DIR}/resources/icons/osx/kilroy.icns)
|
set(QTK_OSX_ICONS ${CMAKE_SOURCE_DIR}/resources/icons/osx/kilroy.icns)
|
||||||
@@ -184,8 +189,8 @@ endif()
|
|||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if(QTK_EXAMPLE)
|
if(QTK_EXAMPLE)
|
||||||
# Create a namespaced alias for linking with qtk_library in the example.
|
# Create a namespaced alias for linking with libqtk in the example.
|
||||||
add_library(${PROJECT_NAME}::qtk_library ALIAS qtk_library)
|
add_library(${PROJECT_NAME}::qtk ALIAS qtk)
|
||||||
add_subdirectory(example-app EXCLUDE_FROM_ALL)
|
add_subdirectory(example-app EXCLUDE_FROM_ALL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -200,3 +205,25 @@ foreach(VAR_NAME IN LISTS VAR_NAMES VAR_PATHS)
|
|||||||
message(STATUS "[Qtk] ${VAR_NAME}=${${VAR_NAME}}")
|
message(STATUS "[Qtk] ${VAR_NAME}=${${VAR_NAME}}")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
message(STATUS "[Qtk] Installation prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||||
|
message(STATUS "[Qtk] Found Qt6: ${Qt6Core_VERSION}")
|
||||||
|
|
||||||
|
# qt_generate_deploy_app_script is supported on Linux in QtCore >= 6.5.0.
|
||||||
|
# qt_generate_deploy_app_script supports Windows and OSX in QtCore >= 6.3.
|
||||||
|
# https://doc.qt.io/qt-6.5/qt-generate-deploy-app-script.html
|
||||||
|
# https://doc.qt.io/archives/qt-6.4/qt-generate-deploy-app-script.html
|
||||||
|
# The application can still build and run, we just can't install.
|
||||||
|
if(QTK_GUI OR QTK_EXAMPLE)
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
# Ubuntu 24.04 provides QtCore 6.4.2 in qt-base-dev.
|
||||||
|
# This version of qt_generate_deploy_app_script does not support Linux.
|
||||||
|
if (Qt6_VERSION VERSION_LESS "6.5.0")
|
||||||
|
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||||
|
endif()
|
||||||
|
elseif(APPLE OR WIN32)
|
||||||
|
# Predates qt_generate_deploy_app_script.
|
||||||
|
if (Qt6_VERSION VERSION_LESS "6.3.0")
|
||||||
|
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|||||||
186
README.md
@@ -1,13 +1,18 @@
|
|||||||
# Qtk
|
# Qtk
|
||||||
|
|
||||||
[](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml)
|
[](https://github.com/shaunrd0/qtk/actions/workflows/build.yml)
|
||||||
[](https://github.com/shaunrd0/qtk/actions/workflows/linting.yml)
|
[](https://github.com/shaunrd0/qtk/actions/workflows/linting.yml)
|
||||||
|
|
||||||
Qtk is a Qt OpenGL graphics library that wraps some QOpenGL functionality in convenience classes
|
|
||||||
that allow rendering geometry in 2D and 3D using custom GLSL shader programs.
|
|
||||||
|
|
||||||
The Qtk desktop application provides a model loader using [Assimp](https://assimp.org/) within a Qt widget application.
|
The Qtk desktop application provides a model loader using [Assimp](https://assimp.org/) within a Qt widget application.
|
||||||
You can fly around the scene using WASD while holding down the right mouse button.
|
You can fly around the scene using WASD while holding down the left or right mouse button.
|
||||||
|
[QtkWidget](./src/designer-plugins/qtkwidget.h) is the primary QOpenGLWidget used to render the scene and handle input.
|
||||||
|
|
||||||
|
The underlying shared library [libqtk](./src/qtk) wraps QOpenGL objects in convenience classes that leverage
|
||||||
|
lower-level OpenGL APIs to handle the rendering process manually. Many of these classes offer
|
||||||
|
ways to expand the low-level OpenGL logic within a Qt application without having to set up much scaffolding.
|
||||||
|
|
||||||
|
The Qtk GUI is built using custom [Qt Designer plugins](https://doc.qt.io/qt-6/designer-creating-custom-widgets.html). These can be installed to Qt Designer for
|
||||||
|
use in other Qt applications, or built exclusively for Qtk. See [Build Options](#build-options) for more details.
|
||||||
|
|
||||||
Object names can be double-clicked in the tree view panel for quick camera navigation.
|
Object names can be double-clicked in the tree view panel for quick camera navigation.
|
||||||
Properties of the object, like shader code and translation / scale, can be viewed and modified in the side panel.
|
Properties of the object, like shader code and translation / scale, can be viewed and modified in the side panel.
|
||||||
@@ -24,7 +29,13 @@ detached from the main window in this way.
|
|||||||
The small triangles floating near 3D models represent the light source being used for the shader.
|
The small triangles floating near 3D models represent the light source being used for the shader.
|
||||||
These appear on models using phong, specular, and diffuse lighting techniques.
|
These appear on models using phong, specular, and diffuse lighting techniques.
|
||||||
|
|
||||||
The default scene contains basic examples like texture mapping to make a crate from basic cube geometry
|
The example scene contains basic examples like texture mapping to make a crate from simple cube geometry.
|
||||||
|
This scene is used in the following screenshots, and can be built locally by enabling
|
||||||
|
the `QTK_GUI_SCENE` [Build Option](#build-options) described below. Because this scene
|
||||||
|
uses large 3D model resources, this option is disabled by default.
|
||||||
|
|
||||||
|
The default scene with this option disabled is empty, but comes with a default skybox.
|
||||||
|
Models can be added to the scene by clicking and dragging an `.obj` into the scene view.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -49,51 +60,76 @@ Key features that are planned:
|
|||||||
- [x] Runtime loading of `.obj` or similar 3D models.
|
- [x] Runtime loading of `.obj` or similar 3D models.
|
||||||
- [x] Drag-and-drop interaction for adding objects to the scene.
|
- [x] Drag-and-drop interaction for adding objects to the scene.
|
||||||
- [x] Shader / object properties panel to modify related settings.
|
- [x] Shader / object properties panel to modify related settings.
|
||||||
|
- [x] Reduce size of application resources and git references.
|
||||||
- [ ] Runtime reloading of modified GLSL shaders attached to objects within scenes.
|
- [ ] Runtime reloading of modified GLSL shaders attached to objects within scenes.
|
||||||
- [ ] Multiple views of a scene at one time.
|
- [ ] Multiple views of a scene at one time.
|
||||||
- [ ] Camera control modes such as panning, orbiting, or following objects.
|
- [ ] Camera control modes such as panning, orbiting, or following objects.
|
||||||
- [ ] Save / load scene data. The current model requires writing C++ code.
|
- [ ] Save / load scene data. The current model requires writing C++ code.
|
||||||
- [ ] Basic text editor for quickly modifying shaders attached to objects.
|
- [ ] Basic text editor for quickly modifying shaders attached to objects.
|
||||||
- [ ] Reduce size of application resources and git references.
|
|
||||||
|
|
||||||
For examples of using the Qtk API, see the `example-app` project in the root of
|
For examples of using libqtk, see the [example-app](./example-app)
|
||||||
this repository.
|
project in the root of this repository.
|
||||||
|
|
||||||
To get textures loading on models look
|
To get textures loading on models look
|
||||||
into [material files](http://www.paulbourke.net/dataformats/mtl/)
|
into [material files](http://www.paulbourke.net/dataformats/mtl/)
|
||||||
and see some examples in the `resources/models/` directory.
|
and see some examples at [qtk-resources/resources/models](https://git.shaunreed.com/shaunrd0/qtk-resources/src/branch/master/models).
|
||||||
|
|
||||||
### Source Builds
|
### Source Builds
|
||||||
|
|
||||||
Qtk was developed and tested using CLion
|
Qtk was developed and tested using CLion
|
||||||
and [Qt Creator](https://github.com/qt-creator/qt-creator).
|
and [Qt Creator](https://github.com/qt-creator/qt-creator).
|
||||||
Simply open the root `CMakeLists.txt` with either of these editors and
|
Simply open the root `CMakeLists.txt` with either of these editors and default
|
||||||
configurations will be loaded.
|
configurations will be loaded. To simplify providing Qt to the build, Qt Creator
|
||||||
|
is the recommended option.
|
||||||
|
|
||||||
This project has been ported to **Qt 6.6.0**, which is not yet available in
|
If you have manually installed [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer)
|
||||||
Ubuntu apt repositories.
|
for your system, be sure to correctly set your `CMAKE_PREFIX_PATH` in the next steps.
|
||||||
To run this project, you will *need* to
|
On Ubuntu 24.04 the default installation directory to use for this path using Qt 6.5.0 is `$HOME/Qt/6.5.0/gcc_64/lib/cmake`.
|
||||||
install [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer) for
|
|
||||||
your system, **version 6.6.0** or later.
|
The Ubuntu apt repositories contain all the packages we need to build all targets.
|
||||||
Be sure to take note of the Qt6 installation directory, as we will need it to
|
To build Qtk desktop application with the scene in the screenshots below run the following commands.
|
||||||
correctly set our `CMAKE_PREFIX_PATH` in the next steps.
|
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt install cmake build-essential git ccache libxkbcommon-dev libassimp-dev qt6-base-dev qt6-tools-dev
|
||||||
|
cmake -DQTK_GUI_SCENE=ON -B build
|
||||||
|
cmake --build build
|
||||||
|
./build/bin/qtk_gui
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Build Options
|
||||||
|
|
||||||
|
Qtk is composed of three separate components.
|
||||||
|
|
||||||
|
* The shared library [libqtk](./src/qtk) provides classes that leverage QOpenGL functionality
|
||||||
|
while still using lower-level OpenGL APIs to customize the rendering process.
|
||||||
|
Many of these classes can be further expanded, such as [Qtk::Scene](./src/qtk/scene.h).
|
||||||
|
This taget, `qtk` in cmake, is always selected to build and install as
|
||||||
|
it is required by all other components in this project.
|
||||||
|
* The [Qtk desktop application](./src/app) is built using libqtk within a Qt application.
|
||||||
|
This target, `qtk_gui` in cmake, is optional and can be controlled using the `QTK_GUI` option below.
|
||||||
|
* The GUI for the Qtk desktop application is constructed using a [custom set of Qt Designer widget plugins](./src/designer-plugins) that are also built using libqtk.
|
||||||
|
If `QTK_GUI` is disabled this target (`qtk_plugins`) is optional and can be controlled using the `QTK_PLUGINS` options below.
|
||||||
|
|
||||||
|
|
||||||
|
| Name | Description | Default |
|
||||||
|
|--------------------------|--------------------------------------------------------------|:--------|
|
||||||
|
| QTK_DEBUG | Enable debug mode. | OFF |
|
||||||
|
| QTK_SUBMODULES | Use git submodules to fetch assimp dependency. | OFF |
|
||||||
|
| QTK_EXAMPLE | Build the libqtk example desktop application. | ON |
|
||||||
|
| QTK_CCACHE | Enable CCACHE. | ON |
|
||||||
|
| QTK_ASSIMP_NEW_INTERFACE | Use the assimp::assimp interface. Recommended for WIN / OSX. | OFF |
|
||||||
|
| QTK_PLUGINS* | Install Qtk plugins to Qt Designer. | OFF |
|
||||||
|
| QTK_GUI | Build and install Qtk desktop application. | ON |
|
||||||
|
| QTK_GUI_SCENE | Fetch external 3D model resources for example scene. | OFF |
|
||||||
|
|
||||||
|
*The Qtk plugins are always built if `QTK_GUI` is enabled. Disabling this option
|
||||||
|
with QTK_GUI set will not mark the plugins for installation if we do
|
||||||
|
`cmake --install build/` without selecting a component. If both `QTK_GUI` and
|
||||||
|
`QTK_PLUGINS` are unset, neither will be built.
|
||||||
|
|
||||||
If you are building on **Windows / Mac**, consider setting
|
If you are building on **Windows / Mac**, consider setting
|
||||||
the `-DQTK_ASSIMP_NEW_INTERFACE` cmake build option.
|
the `-DQTK_ASSIMP_NEW_INTERFACE` cmake build option.
|
||||||
|
|
||||||
If the build is configured with all options enabled, we can subsequently install
|
|
||||||
individual components as needed with cmake.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt update -y && sudo apt install libassimp-dev cmake build-essential git ccache libgl1-mesa-dev libglvnd-dev zlib1g-dev -y
|
|
||||||
git clone https://github.com/shaunrd0/qtk
|
|
||||||
cd qtk
|
|
||||||
# Configure the build with all components enabled
|
|
||||||
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
|
||||||
# Build all targets
|
|
||||||
cmake --build build-all/
|
|
||||||
````
|
|
||||||
|
|
||||||
By default, the build will not initialize Assimp as a git submodule and build
|
By default, the build will not initialize Assimp as a git submodule and build
|
||||||
from source.
|
from source.
|
||||||
We can turn this on by setting the `-DQTK_SUBMODULES=ON` flag when running
|
We can turn this on by setting the `-DQTK_SUBMODULES=ON` flag when running
|
||||||
@@ -101,47 +137,57 @@ CMake.
|
|||||||
Building using this option will fetch and build Assimp for us, but builds will
|
Building using this option will fetch and build Assimp for us, but builds will
|
||||||
take longer as a result.
|
take longer as a result.
|
||||||
Using `-DQTK_SUBMODULES=ON` supports providing assimp on cross-platform builds (
|
Using `-DQTK_SUBMODULES=ON` supports providing assimp on cross-platform builds (
|
||||||
Windows / Mac / Linux) and may be easier
|
Windows / Mac / Linux) and may be easier to configure.
|
||||||
to configure.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DQTK_SUBMODULES=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DQTK_SUBMODULES=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Qtk GUI
|
#### Qtk Components
|
||||||
|
|
||||||
|
As described in [Build Options](#build-options), Qtk is composed of three separate components.
|
||||||
|
Each component can be individually selected for building or installation.
|
||||||
|
|
||||||
|
For this example we will configure the build with all options enabled.
|
||||||
|
In the separate sections below we can install individual components with cmake.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake --build build-all/ --target qtk_gui -- -j $(nproc)
|
sudo apt update -y && sudo apt install cmake build-essential git ccache libxkbcommon-dev libassimp-dev qt6-base-dev qt6-tools-dev -y
|
||||||
# Install Qtk desktop application (output removed)
|
git clone https://github.com/shaunrd0/qtk
|
||||||
# Installation prefix path must be absolute, since Qtk uses Qt deploy tools.
|
cd qtk
|
||||||
cmake --install build-all/ --component qtk_gui --prefix=$(pwd)/install
|
# Configure the build with all components enabled
|
||||||
./install/bin/qtk_gui
|
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
||||||
```
|
# Build all targets
|
||||||
|
cmake --build build-all/
|
||||||
|
````
|
||||||
|
|
||||||
If any errors are encountered loading plugins, we can debug plugin loading by
|
Now that we have all the components fully built, the following sections will
|
||||||
setting the following environment variable -
|
install each component individually.
|
||||||
|
If you want to uninstall previously installed components, run the following command.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
QT_DEBUG_PLUGINS=1 ./install/bin/qtk_gui
|
sudo xargs rm -v < install_manifest.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Qtk Library
|
##### Qtk Library
|
||||||
|
|
||||||
Qtk provides a simple library for working with QOpenGL.
|
Shared libqtk library for working with lower-level OpenGL to customize the rendering process.
|
||||||
We can install this library on a system path or a custom path and then
|
We can install this library on a system path or a custom path and then
|
||||||
set `CMAKE_PREFIX_PATH` to point to this location when building an application
|
set `CMAKE_PREFIX_PATH` to point to this location when building an application
|
||||||
using libqtk.
|
using libqtk.
|
||||||
|
|
||||||
|
Here we will install to the `/usr/local/` path.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Install libqtk only
|
# Install libqtk only
|
||||||
cmake --build build-all/ --target qtk_library -- -j $(nproc)
|
cmake --build build-all/ --target qtk -- -j $(nproc)
|
||||||
cmake --install build-all/ --component qtk_library --prefix=/usr/local
|
cmake --install build-all/ --component qtk --prefix=/usr/local
|
||||||
-- Install configuration: "Release"
|
-- Install configuration: "Release"
|
||||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfig.cmake
|
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfig.cmake
|
||||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfigVersion.cmake
|
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfigVersion.cmake
|
||||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets.cmake
|
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets.cmake
|
||||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets-release.cmake
|
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets-release.cmake
|
||||||
-- Installing: /usr/local/lib/static/libqtk_library.a
|
-- Installing: /usr/local/lib/static/libqtk.a
|
||||||
-- Installing: /usr/local/include/qtk/camera3d.h
|
-- Installing: /usr/local/include/qtk/camera3d.h
|
||||||
-- Installing: /usr/local/include/qtk/input.h
|
-- Installing: /usr/local/include/qtk/input.h
|
||||||
-- Installing: /usr/local/include/qtk/meshrenderer.h
|
-- Installing: /usr/local/include/qtk/meshrenderer.h
|
||||||
@@ -158,7 +204,26 @@ cmake --install build-all/ --component qtk_library --prefix=/usr/local
|
|||||||
-- Installing: /usr/local/include/qtk/transform3D.h
|
-- Installing: /usr/local/include/qtk/transform3D.h
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Qtk Plugin Collection
|
##### Qtk GUI
|
||||||
|
|
||||||
|
The Qtk desktop application can be built and installed with the following commands.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake --build build-all/ --target qtk_gui -- -j $(nproc)
|
||||||
|
# Install Qtk desktop application (output removed)
|
||||||
|
# Installation prefix path must be absolute, since Qtk uses Qt deploy tools.
|
||||||
|
cmake --install build-all/ --component qtk_gui --prefix=$(pwd)/install
|
||||||
|
./install/bin/qtk_gui
|
||||||
|
```
|
||||||
|
|
||||||
|
If any errors are encountered loading plugins, we can debug plugin loading by
|
||||||
|
setting the following environment variable
|
||||||
|
|
||||||
|
```bash
|
||||||
|
QT_DEBUG_PLUGINS=1 ./install/bin/qtk_gui
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Qtk Plugin Collection
|
||||||
|
|
||||||
This project defines a collection of widget plugins for use with Qt Designer.
|
This project defines a collection of widget plugins for use with Qt Designer.
|
||||||
These plugins were used to build the interface for the Qtk desktop application.
|
These plugins were used to build the interface for the Qtk desktop application.
|
||||||
@@ -179,19 +244,12 @@ cmake --build build-all/ --target qtk_plugins -- -j $(nproc)
|
|||||||
# The path here should be initialized during build configuration, so no need for --prefix
|
# The path here should be initialized during build configuration, so no need for --prefix
|
||||||
cmake --install build-all/ --component qtk_plugins
|
cmake --install build-all/ --component qtk_plugins
|
||||||
-- Install configuration: "Release"
|
-- Install configuration: "Release"
|
||||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk_library.a
|
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk.a
|
||||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk_plugin_library.a
|
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk_plugin_library.a
|
||||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/plugins/designer/libqtk_collection.so
|
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/plugins/designer/libqtk_collection.so
|
||||||
```
|
```
|
||||||
|
|
||||||
To uninstall after a previous installation, we can run the following command
|
#### Example libqtk Application
|
||||||
from the root of the repository.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xargs rm < build/install_manifest.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Qtk Example
|
|
||||||
|
|
||||||
There is a simple example of using libqtk in the [example-app/](example-app)
|
There is a simple example of using libqtk in the [example-app/](example-app)
|
||||||
directory. The example can be built standalone using `find_package` or as a
|
directory. The example can be built standalone using `find_package` or as a
|
||||||
@@ -213,7 +271,7 @@ This project is using `clang-format` version `>=15.0.5`.
|
|||||||
On Ubuntu 24.04, clang-format 18 is available to install in apt repositories.
|
On Ubuntu 24.04, clang-format 18 is available to install in apt repositories.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt install clang-format
|
sudo apt install clang-format clang-tidy
|
||||||
```
|
```
|
||||||
|
|
||||||
If `clang-format --version` is any earlier than `15.0.0`, running `clang-format` will fail because this project uses configuration options made available since `15.0.0`.
|
If `clang-format --version` is any earlier than `15.0.0`, running `clang-format` will fail because this project uses configuration options made available since `15.0.0`.
|
||||||
@@ -238,14 +296,18 @@ If you'd still like to run these tools manually, see the instructions below.
|
|||||||
cd qtk
|
cd qtk
|
||||||
# Build
|
# Build
|
||||||
cmake -B build && cmake --build build -- -j $(nproc)
|
cmake -B build && cmake --build build -- -j $(nproc)
|
||||||
clang-tidy -p build/ --fix --config-file=.clang-tidy src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export SOURCES=src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
|
||||||
|
run-clang-tidy -p build/ -j $(nproc --ignore=1) -fix -config-file=.clang-tidy $SOURCES
|
||||||
```
|
```
|
||||||
|
|
||||||
Last we need to run `clang-format`, this can be done with the command directly.
|
Last we need to run `clang-format`, this can be done with the command directly.
|
||||||
This will reformat all the code in the repository.
|
This will reformat all the code in the repository.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
clang-format -i --style=file:.clang-format src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
|
clang-format -i --style=file:.clang-format $SOURCES
|
||||||
```
|
```
|
||||||
|
|
||||||
`clang-format` can be run with git integration (or CLion if you prefer).
|
`clang-format` can be run with git integration (or CLion if you prefer).
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
## Example client project using qtk ##
|
## Example client project using qtk ##
|
||||||
## ##
|
## ##
|
||||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
cmake_minimum_required(VERSION 3.23)
|
cmake_minimum_required(VERSION 3.23)
|
||||||
|
|
||||||
@@ -56,8 +56,8 @@ endif()
|
|||||||
|
|
||||||
# Allow add_subdirectory on this project to use target ALIAS if available.
|
# Allow add_subdirectory on this project to use target ALIAS if available.
|
||||||
# If this example project is opened standalone we will use find_package.
|
# If this example project is opened standalone we will use find_package.
|
||||||
if(NOT TARGET Qtk::qtk_library)
|
if(NOT TARGET Qtk::qtk)
|
||||||
find_package(Qtk 0.2 REQUIRED)
|
find_package(Qtk 0.3 REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Qt6 COMPONENTS Core Widgets OpenGLWidgets REQUIRED)
|
find_package(Qt6 COMPONENTS Core Widgets OpenGLWidgets REQUIRED)
|
||||||
@@ -77,20 +77,27 @@ configure_file(
|
|||||||
|
|
||||||
qt_add_executable(qtk_example ${EXAMPLE_SOURCES})
|
qt_add_executable(qtk_example ${EXAMPLE_SOURCES})
|
||||||
target_link_libraries(qtk_example PUBLIC Qt6::Widgets Qt6::OpenGLWidgets Qt6::Core)
|
target_link_libraries(qtk_example PUBLIC Qt6::Widgets Qt6::OpenGLWidgets Qt6::Core)
|
||||||
target_link_libraries(qtk_example PUBLIC Qtk::qtk_library)
|
target_link_libraries(qtk_example PUBLIC Qtk::qtk)
|
||||||
target_include_directories(qtk_example PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
target_include_directories(qtk_example PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
|
||||||
install(
|
# qt_generate_deploy_app_script supports Windows and OSX in QtCore >= 6.3.
|
||||||
|
# qt_generate_deploy_app_script is supported on Linux in QtCore >= 6.5.0.
|
||||||
|
if((Qt6_VERSION VERSION_GREATER_EQUAL "6.3.0" AND (WIN32 OR APPLE))
|
||||||
|
OR Qt6_VERSION VERSION_GREATER_EQUAL "6.5.0")
|
||||||
|
install(
|
||||||
TARGETS qtk_example
|
TARGETS qtk_example
|
||||||
COMPONENT qtk_example
|
COMPONENT qtk_example
|
||||||
BUNDLE DESTINATION .
|
BUNDLE DESTINATION .
|
||||||
LIBRARY DESTINATION lib
|
LIBRARY DESTINATION lib
|
||||||
ARCHIVE DESTINATION lib/static
|
ARCHIVE DESTINATION lib/static
|
||||||
RUNTIME DESTINATION bin
|
RUNTIME DESTINATION bin
|
||||||
)
|
)
|
||||||
qt_generate_deploy_app_script(
|
qt_generate_deploy_app_script(
|
||||||
TARGET qtk_example
|
TARGET qtk_example
|
||||||
OUTPUT_SCRIPT QTK_EXAMPLE_DEPLOY_SCRIPT
|
OUTPUT_SCRIPT QTK_EXAMPLE_DEPLOY_SCRIPT
|
||||||
NO_UNSUPPORTED_PLATFORM_ERROR
|
NO_UNSUPPORTED_PLATFORM_ERROR
|
||||||
)
|
)
|
||||||
install(SCRIPT ${QTK_EXAMPLE_DEPLOY_SCRIPT} COMPONENT qtk_example)
|
install(SCRIPT ${QTK_EXAMPLE_DEPLOY_SCRIPT} COMPONENT qtk_example)
|
||||||
|
elseif(NOT Qtk_IS_TOP_LEVEL)
|
||||||
|
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -22,12 +22,7 @@ ExampleScene::~ExampleScene() = default;
|
|||||||
|
|
||||||
void ExampleScene::init()
|
void ExampleScene::init()
|
||||||
{
|
{
|
||||||
setSkybox(new Qtk::Skybox("Skybox"));
|
setSkybox(new Qtk::Skybox);
|
||||||
|
|
||||||
std::string spartanPath = QTK_EXAMPLE_SOURCE_DIR;
|
|
||||||
spartanPath += "/../resources/models/spartan/spartan.obj";
|
|
||||||
auto spartan = addObject(new Model("spartan", spartanPath.c_str()));
|
|
||||||
spartan->getTransform().setTranslation(-4.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
auto mesh = addObject(
|
auto mesh = addObject(
|
||||||
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# $1: Input path to an image to use for generating icons.
|
# $1: Input path to an image to use for generating icons.
|
||||||
# Helper script to generate qtk's icons for OSX given a path to an input PNG.
|
# Helper script to generate qtk's icons for Windows given a path to an input PNG.
|
||||||
sudo apt install imagemagick
|
sudo apt install imagemagick
|
||||||
|
|
||||||
# For the NSIS (un)installer executable shortcut icon.
|
# For the NSIS (un)installer executable shortcut icon.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.8 MiB |
21
resources/minimal_resources.qrc
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/textures">
|
||||||
|
<file alias="crate.png">images/crate.png</file>
|
||||||
|
<file alias="stone.png">images/stone.png</file>
|
||||||
|
<file alias="wood.png">images/wood.png</file>
|
||||||
|
<file>skybox/back.png</file>
|
||||||
|
<file>skybox/bottom.png</file>
|
||||||
|
<file>skybox/front.png</file>
|
||||||
|
<file>skybox/left.png</file>
|
||||||
|
<file>skybox/right.png</file>
|
||||||
|
<file>skybox/top.png</file>
|
||||||
|
</qresource>
|
||||||
|
<qresource prefix="/icons">
|
||||||
|
<file>fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</file>
|
||||||
|
<file>fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</file>
|
||||||
|
<file>fontawesome-free-6.2.1-desktop/svgs/regular/folder-open.svg</file>
|
||||||
|
<file>fontawesome-free-6.2.1-desktop/svgs/regular/floppy-disk.svg</file>
|
||||||
|
<file>fontawesome-free-6.2.1-desktop/svgs/brands/git-alt.svg</file>
|
||||||
|
<file alias="icon.png">icons/icon.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Blender MTL File: 'None'
|
|
||||||
# Material Count: 4
|
|
||||||
|
|
||||||
newmtl AlienHominid
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.533344 0.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Bump normal.png
|
|
||||||
map_Kd diffuse.png
|
|
||||||
map_Ns roughness.png
|
|
||||||
refl specular.png
|
|
||||||
|
|
||||||
newmtl Blaster
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Bump blaster_normal.png
|
|
||||||
map_Kd blaster_diffuse.png
|
|
||||||
map_Ke blaster_emissive.png
|
|
||||||
map_Ns blaster_roughness.png
|
|
||||||
refl blaster_specular.png
|
|
||||||
|
|
||||||
newmtl Screenshot_2021-04-19_194508
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd smoke.png
|
|
||||||
map_d smoke.png
|
|
||||||
|
|
||||||
newmtl Untitled-1
|
|
||||||
Ns 77.904748
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Untitled-1.png
|
|
||||||
map_d Untitled-1.png
|
|
||||||
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 455 KiB |
|
Before Width: | Height: | Size: 9.4 MiB |
|
Before Width: | Height: | Size: 5.2 MiB |
|
Before Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 8.8 MiB |
|
Before Width: | Height: | Size: 10 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
@@ -1,16 +0,0 @@
|
|||||||
# Blender MTL File: 'None'
|
|
||||||
# Material Count: 1
|
|
||||||
|
|
||||||
newmtl Scene_-_Root
|
|
||||||
Ns 225.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.800000 0.800000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.0 0.0 0.0
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd diffuse.jpg
|
|
||||||
map_Bump normal.png
|
|
||||||
map_Ks specular.jpg
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 5.8 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 4.2 MiB |
@@ -1,3 +0,0 @@
|
|||||||
Model by Berk Gedik, from: https://sketchfab.com/3d-models/survival-guitar-backpack-low-poly-799f8c4511f84fab8c3f12887f7e6b36
|
|
||||||
|
|
||||||
Modified material assignment (Joey de Vries) for easier load in OpenGL model loading chapter, and renamed albedo to diffuse and metallic to specular to match non-PBR lighting setup.
|
|
||||||
|
Before Width: | Height: | Size: 6.4 MiB |
@@ -1,7 +0,0 @@
|
|||||||
newmtl material_0
|
|
||||||
map_bump normal.jpg
|
|
||||||
norm normal.jpg
|
|
||||||
map_Kd diffuse.jpg
|
|
||||||
occlusion occlusion.jpg
|
|
||||||
Pm 0
|
|
||||||
Pr 0.793152
|
|
||||||
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
@@ -1,12 +0,0 @@
|
|||||||
# Blender v2.82 (sub 7) OBJ File: ''
|
|
||||||
# www.blender.org
|
|
||||||
mtllib floor.mtl
|
|
||||||
o floor
|
|
||||||
v -1.000000 -0.000000 1.000000
|
|
||||||
v 1.000000 -0.000000 1.000000
|
|
||||||
v 1.000000 0.000000 -1.000000
|
|
||||||
v -1.000000 0.000000 -1.000000
|
|
||||||
vn 0.0000 1.0000 0.0000
|
|
||||||
usemtl Default_OBJ
|
|
||||||
s off
|
|
||||||
f 1//1 2//1 3//1 4//1
|
|
||||||
|
Before Width: | Height: | Size: 133 KiB |
@@ -1,8 +0,0 @@
|
|||||||
# WaveFront *.mtl file (generated by CINEMA 4D)
|
|
||||||
|
|
||||||
newmtl item/objectcomponents/weapon/staff_2h_artifactdeadwind_d_03.m2_Geoset_000
|
|
||||||
Ka 0.25 0.25 0.25
|
|
||||||
Kd 1 1 1
|
|
||||||
map_Kd diffuse.png
|
|
||||||
illum 7
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 807 KiB |
|
Before Width: | Height: | Size: 5.9 MiB |
|
Before Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 614 KiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 4.8 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 4.5 MiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 885 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 426 KiB |
|
Before Width: | Height: | Size: 983 KiB |
|
Before Width: | Height: | Size: 484 KiB |
|
Before Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 930 KiB |
|
Before Width: | Height: | Size: 3.9 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 4.4 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 862 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 1008 KiB |
|
Before Width: | Height: | Size: 4.8 MiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 638 KiB |
|
Before Width: | Height: | Size: 844 KiB |
|
Before Width: | Height: | Size: 3.4 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 3.8 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 761 KiB |
|
Before Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 2.5 MiB |
|
Before Width: | Height: | Size: 24 MiB |
|
Before Width: | Height: | Size: 4.9 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 7.8 MiB |
|
Before Width: | Height: | Size: 4.3 MiB |
|
Before Width: | Height: | Size: 1.9 MiB |
@@ -1,104 +0,0 @@
|
|||||||
# Blender MTL File: 'None'
|
|
||||||
# Material Count: 8
|
|
||||||
|
|
||||||
newmtl Spartan_Arms_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Arms_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Arms_Mat_Normal.png
|
|
||||||
refl Spartan_Arms_Mat_Specular.png
|
|
||||||
|
|
||||||
|
|
||||||
newmtl Spartan_Chest_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Chest_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Chest_Mat_Normal.png
|
|
||||||
refl Spartan_Chest_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl Spartan_Ear_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Ears_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Ears_Mat_Normal.png
|
|
||||||
refl Spartan_Ears_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl Spartan_Helmet_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Helmet_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Helmet_Mat_Normal.png
|
|
||||||
refl Spartan_Helmet_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl Spartan_Legs_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Legs_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Legs_Mat_Normal.png
|
|
||||||
refl Spartan_Legs_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl Spartan_Shoulders_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Shoulder_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Shoulder_Mat_Normal.png
|
|
||||||
refl Spartan_Shoulder_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl Spartan_Undersuit_Mat
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 1.000000 1.000000 1.000000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
map_Kd Spartan_Undersuit_Mat_BaseColor.png
|
|
||||||
map_Bump Spartan_Undersuit_Mat_Normal.png
|
|
||||||
refl Spartan_Undersuit_Mat_Specular.png
|
|
||||||
|
|
||||||
newmtl lambert1
|
|
||||||
Ns 179.999996
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.500000 0.500000 0.500000
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/textures">
|
<qresource prefix="/textures">
|
||||||
<file alias="plaster.png">images/plaster.png</file>
|
|
||||||
<file alias="crate.png">images/crate.png</file>
|
<file alias="crate.png">images/crate.png</file>
|
||||||
<file alias="stone.png">images/stone.png</file>
|
<file alias="stone.png">images/stone.png</file>
|
||||||
<file alias="wood.png">images/wood.png</file>
|
<file alias="wood.png">images/wood.png</file>
|
||||||
@@ -28,8 +27,6 @@
|
|||||||
<file alias="solid.vert">shaders/vertex/solid.vert</file>
|
<file alias="solid.vert">shaders/vertex/solid.vert</file>
|
||||||
<file alias="solid-perspective.frag">shaders/fragment/solid-perspective.frag</file>
|
<file alias="solid-perspective.frag">shaders/fragment/solid-perspective.frag</file>
|
||||||
<file alias="solid-perspective.vert">shaders/vertex/solid-perspective.vert</file>
|
<file alias="solid-perspective.vert">shaders/vertex/solid-perspective.vert</file>
|
||||||
<file alias="multi-color.frag">shaders/fragment/multi-color.frag</file>
|
|
||||||
<file alias="multi-color.vert">shaders/vertex/multi-color.vert</file>
|
|
||||||
<file alias="rgb-normals.frag">shaders/fragment/rgb-normals.frag</file>
|
<file alias="rgb-normals.frag">shaders/fragment/rgb-normals.frag</file>
|
||||||
<file alias="rgb-normals.vert">shaders/vertex/rgb-normals.vert</file>
|
<file alias="rgb-normals.vert">shaders/vertex/rgb-normals.vert</file>
|
||||||
<file alias="texture-cubemap.frag">shaders/fragment/texture-cubemap.frag</file>
|
<file alias="texture-cubemap.frag">shaders/fragment/texture-cubemap.frag</file>
|
||||||
@@ -44,88 +41,9 @@
|
|||||||
<file alias="solid-specular.vert">shaders/vertex/solid-specular.vert</file>
|
<file alias="solid-specular.vert">shaders/vertex/solid-specular.vert</file>
|
||||||
<file alias="solid-phong.frag">shaders/fragment/solid-phong.frag</file>
|
<file alias="solid-phong.frag">shaders/fragment/solid-phong.frag</file>
|
||||||
<file alias="solid-phong.vert">shaders/vertex/solid-phong.vert</file>
|
<file alias="solid-phong.vert">shaders/vertex/solid-phong.vert</file>
|
||||||
<file alias="model-basic.frag">shaders/fragment/model-basic.frag</file>
|
|
||||||
<file alias="model-basic.vert">shaders/vertex/model-basic.vert</file>
|
|
||||||
<file alias="model-phong.frag">shaders/fragment/model-phong.frag</file>
|
<file alias="model-phong.frag">shaders/fragment/model-phong.frag</file>
|
||||||
<file alias="model-phong.vert">shaders/vertex/model-phong.vert</file>
|
<file alias="model-phong.vert">shaders/vertex/model-phong.vert</file>
|
||||||
<file alias="model-normals.frag">shaders/fragment/model-normals.frag</file>
|
<file alias="model-normals.frag">shaders/fragment/model-normals.frag</file>
|
||||||
<file alias="model-normals.vert">shaders/vertex/model-normals.vert</file>
|
<file alias="model-normals.vert">shaders/vertex/model-normals.vert</file>
|
||||||
<file alias="skybox.frag">skybox/skybox.frag</file>
|
|
||||||
<file alias="skybox.vert">skybox/skybox.vert</file>
|
|
||||||
</qresource>
|
|
||||||
<qresource prefix="/models">
|
|
||||||
<file>models/spartan/spartan.obj</file>
|
|
||||||
<file>models/alien-hominid/alien.obj</file>
|
|
||||||
<file>models/spartan/spartan.mtl</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Undersuit_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Shoulder_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Legs_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Helmet_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Ears_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Chest_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_Specular.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_Roughness.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_Normal.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_Metallic.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_BaseColor.png</file>
|
|
||||||
<file>models/spartan/Spartan_Arms_Mat_AO.png</file>
|
|
||||||
<file>models/spartan/lambert1_Roughness.png</file>
|
|
||||||
<file>models/spartan/lambert1_Nrm.png</file>
|
|
||||||
<file>models/spartan/lambert1_Colour-Opacity.png</file>
|
|
||||||
<file>models/backpack/specular.jpg</file>
|
|
||||||
<file>models/backpack/roughness.jpg</file>
|
|
||||||
<file>models/backpack/diffuse.jpg</file>
|
|
||||||
<file>models/backpack/normal.png</file>
|
|
||||||
<file>models/backpack/backpack.obj</file>
|
|
||||||
<file>models/backpack/backpack.mtl</file>
|
|
||||||
<file>models/backpack/ao.jpg</file>
|
|
||||||
<file>models/alien-hominid/specular.png</file>
|
|
||||||
<file>models/alien-hominid/roughness.png</file>
|
|
||||||
<file>models/alien-hominid/normal.png</file>
|
|
||||||
<file>models/alien-hominid/diffuse.png</file>
|
|
||||||
<file>models/alien-hominid/blaster_specular.png</file>
|
|
||||||
<file>models/alien-hominid/blaster_roughness.png</file>
|
|
||||||
<file>models/alien-hominid/blaster_normal.png</file>
|
|
||||||
<file>models/alien-hominid/blaster_emissive.png</file>
|
|
||||||
<file>models/alien-hominid/blaster_diffuse.png</file>
|
|
||||||
<file>models/alien-hominid/alien.mtl</file>
|
|
||||||
<file>models/scythe/scythe.obj</file>
|
|
||||||
<file>models/scythe/scythe.mtl</file>
|
|
||||||
<file>models/scythe/diffuse.png</file>
|
|
||||||
<file>models/bird/occlusion.jpg</file>
|
|
||||||
<file>models/bird/normal.jpg</file>
|
|
||||||
<file>models/bird/diffuse.jpg</file>
|
|
||||||
<file>models/bird/bird.obj</file>
|
|
||||||
<file>models/bird/bird.mtl</file>
|
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
#version 330 core
|
|
||||||
out vec4 fColor;
|
|
||||||
|
|
||||||
in vec2 vTextureCoord;
|
|
||||||
|
|
||||||
uniform sampler2D texture_diffuse1;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
fColor = texture(texture_diffuse1, vTextureCoord);
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#version 330
|
|
||||||
in vec4 vColor;
|
|
||||||
|
|
||||||
out vec4 fColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
fColor = vColor;
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#version 330 core
|
|
||||||
layout (location = 0) in vec3 aPosition;
|
|
||||||
layout (location = 1) in vec3 aNormal;
|
|
||||||
layout (location = 2) in vec2 aTextureCoord;
|
|
||||||
|
|
||||||
out vec2 vTextureCoord;
|
|
||||||
|
|
||||||
uniform mat4 uModel;
|
|
||||||
uniform mat4 uView;
|
|
||||||
uniform mat4 uProjection;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vTextureCoord = aTextureCoord;
|
|
||||||
gl_Position = uProjection * uView * uModel * vec4(aPosition, 1.0);
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#version 330
|
|
||||||
layout(location = 0) in vec3 aPosition;
|
|
||||||
layout(location = 1) in vec3 aColor;
|
|
||||||
|
|
||||||
out vec4 vColor;
|
|
||||||
|
|
||||||
uniform mat4 uModel; // Model
|
|
||||||
uniform mat4 uView; // View
|
|
||||||
uniform mat4 uProjection; // Projection
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
gl_Position = uProjection * uView * uModel * vec4(aPosition, 1.0);
|
|
||||||
|
|
||||||
vColor = vec4(aColor, 1.0f);
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#version 330
|
|
||||||
uniform samplerCube uTexture;
|
|
||||||
|
|
||||||
varying vec3 vTexCoord;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
gl_FragColor = texture(uTexture, vTexCoord);
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#version 330
|
|
||||||
layout(location = 0) in vec3 aPosition;
|
|
||||||
|
|
||||||
out vec3 vTexCoord;
|
|
||||||
|
|
||||||
uniform mat4 uProjectionMatrix;
|
|
||||||
uniform mat4 uViewMatrix;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
// Strip translation column from camera's 4x4 matrix
|
|
||||||
mat4 view = mat4(mat3(uViewMatrix));
|
|
||||||
gl_Position = uProjectionMatrix * view * vec4(aPosition, 1.0);
|
|
||||||
vTexCoord = aPosition;
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
## 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 ##
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
# Qtk Library
|
# Qtk Library
|
||||||
@@ -13,22 +13,22 @@ install(
|
|||||||
FILES
|
FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
COMPONENT qtk_library
|
COMPONENT qtk
|
||||||
DESTINATION lib/cmake/${PROJECT_NAME}
|
DESTINATION lib/cmake/${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
install(
|
install(
|
||||||
EXPORT qtk_export
|
EXPORT qtk_export
|
||||||
FILE ${PROJECT_NAME}Targets.cmake
|
FILE ${PROJECT_NAME}Targets.cmake
|
||||||
NAMESPACE ${PROJECT_NAME}::
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
COMPONENT qtk_library
|
COMPONENT qtk
|
||||||
DESTINATION lib/cmake/${PROJECT_NAME}
|
DESTINATION lib/cmake/${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
# System install for qtk_library
|
# System install for libqtk
|
||||||
install(
|
install(
|
||||||
TARGETS qtk_library
|
TARGETS qtk
|
||||||
# Associate qtk_library target with qtk-export
|
# Associate libqtk target with qtk-export
|
||||||
EXPORT qtk_export
|
EXPORT qtk_export
|
||||||
COMPONENT qtk_library
|
COMPONENT qtk
|
||||||
FILE_SET HEADERS DESTINATION include
|
FILE_SET HEADERS DESTINATION include
|
||||||
INCLUDES DESTINATION include
|
INCLUDES DESTINATION include
|
||||||
LIBRARY DESTINATION lib
|
LIBRARY DESTINATION lib
|
||||||
@@ -36,60 +36,16 @@ install(
|
|||||||
RUNTIME DESTINATION bin
|
RUNTIME DESTINATION bin
|
||||||
)
|
)
|
||||||
|
|
||||||
# Qtk Application
|
# The Qtk Application's GUI requires plugins to be built, but not installed.
|
||||||
if(QTK_GUI OR QTK_PLUGINS)
|
# If both are disabled we can skip. If QTK_PLUGINS is set we'll install the
|
||||||
add_subdirectory(app)
|
# plugins to Qt Designer for use in other projects.
|
||||||
endif()
|
if(QTK_PLUGINS OR QTK_GUI)
|
||||||
|
add_subdirectory(designer-plugins)
|
||||||
if(QTK_PLUGINS)
|
|
||||||
install(
|
|
||||||
TARGETS qtk_plugins qtk_library qtk_plugin_library
|
|
||||||
COMPONENT qtk_plugins
|
|
||||||
LIBRARY DESTINATION "${QTK_PLUGIN_INSTALL_DIR}"
|
|
||||||
ARCHIVE DESTINATION "${QTK_PLUGIN_INSTALL_DIR}"
|
|
||||||
RUNTIME DESTINATION "${QTK_PLUGIN_INSTALL_DIR}"
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Build Qtk Application only if QTK_GUI is set.
|
||||||
if(QTK_GUI)
|
if(QTK_GUI)
|
||||||
install(
|
add_subdirectory(app)
|
||||||
TARGETS qtk_gui
|
|
||||||
COMPONENT qtk_gui
|
|
||||||
BUNDLE DESTINATION .
|
|
||||||
LIBRARY DESTINATION lib
|
|
||||||
ARCHIVE DESTINATION lib
|
|
||||||
RUNTIME DESTINATION bin
|
|
||||||
)
|
|
||||||
|
|
||||||
qt_generate_deploy_app_script(
|
|
||||||
TARGET qtk_gui
|
|
||||||
OUTPUT_SCRIPT QTK_DEPLOY_SCRIPT
|
|
||||||
NO_UNSUPPORTED_PLATFORM_ERROR
|
|
||||||
)
|
|
||||||
install(SCRIPT ${QTK_DEPLOY_SCRIPT} COMPONENT qtk_gui)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
if(MSVC AND TARGET Qt6::qmake)
|
|
||||||
get_target_property(QT6_QMAKE_LOCATION Qt6::qmake IMPORTED_LOCATION)
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${QT6_QMAKE_LOCATION}" -query QT_INSTALL_PREFIX
|
|
||||||
RESULT_VARIABLE return_code
|
|
||||||
OUTPUT_VARIABLE QT6_INSTALL_PREFIX
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
file(TO_NATIVE_PATH "${QT6_INSTALL_PREFIX}/bin" QT6_INSTALL_PREFIX)
|
|
||||||
|
|
||||||
set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk_gui.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")
|
|
||||||
file(APPEND ${VSUSER_FILE} " <LocalDebuggerEnvironment>Path=$(SolutionDir)\\lib\\$(Configuration);${QT6_INSTALL_PREFIX};$(Path)\n")
|
|
||||||
file(APPEND ${VSUSER_FILE} "$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>\n")
|
|
||||||
file(APPEND ${VSUSER_FILE} " <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n")
|
|
||||||
file(APPEND ${VSUSER_FILE} " </PropertyGroup>\n")
|
|
||||||
file(APPEND ${VSUSER_FILE} "</Project>\n")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
@@ -119,26 +75,38 @@ set(CPACK_PACKAGE_CONTACT "shaunreed.com")
|
|||||||
set(CPACK_THREADS 0)
|
set(CPACK_THREADS 0)
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Qtk")
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Qtk")
|
||||||
|
|
||||||
if (WIN32)
|
# Remove any assimp components if defined by submodule.
|
||||||
|
if (QTK_SUBMODULES)
|
||||||
|
get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS)
|
||||||
|
list(FILTER CPACK_COMPONENTS_ALL EXCLUDE REGEX .*assimp.*)
|
||||||
|
list(REMOVE_ITEM CPACK_COMPONENTS_ALL Unspecified)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
# Windows
|
# Windows
|
||||||
# Set icon for the splash image used in Windows NSIS installers.
|
# Set icon for the splash image used in Windows NSIS installers.
|
||||||
set(CPACK_PACKAGE_ICON "${QTK_RESOURCES}/icons/win/kilroy_splash.bmp")
|
# TODO: Fix NSIS cmake error
|
||||||
|
# File: "D:/a/qtk/qtk/resources/icons/win/kilroy_splash.bmp" -> no files found.
|
||||||
|
#set(CPACK_PACKAGE_ICON "${QTK_RESOURCES}/icons/win/kilroy_splash.bmp")
|
||||||
set(CPACK_NSIS_MODIFY_PATH ON)
|
set(CPACK_NSIS_MODIFY_PATH ON)
|
||||||
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
||||||
# https://nsis.sourceforge.io/Reference/CreateShortCut
|
# https://nsis.sourceforge.io/Reference/CreateShortCut
|
||||||
|
# TODO: Use 4th parameter to pass icon.
|
||||||
set(
|
set(
|
||||||
CPACK_NSIS_CREATE_ICONS_EXTRA
|
CPACK_NSIS_CREATE_ICONS_EXTRA
|
||||||
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_gui.exe'"
|
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_gui.exe'\n\
|
||||||
|
CreateShortCut '$DESKTOP\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_gui.exe'"
|
||||||
)
|
)
|
||||||
set(
|
set(
|
||||||
CPACK_NSIS_DELETE_ICONS_EXTRA
|
CPACK_NSIS_DELETE_ICONS_EXTRA
|
||||||
"Delete '$SMPROGRAMS\\\\$START_MENU\\\\Qtk.lnk'"
|
"Delete '$SMPROGRAMS\\\\$START_MENU\\\\Qtk.lnk'\n\
|
||||||
|
Delete '$DESKTOP\\\\Qtk.lnk'"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Set icon for the installer executable.
|
# Set icon for the installer executable.
|
||||||
set(CPACK_NSIS_MUI_ICON "${QTK_RESOURCES}/icons/win/kilroy.ico")
|
set(CPACK_NSIS_MUI_ICON "${QTK_RESOURCES}/icons/win/kilroy.ico")
|
||||||
# Set icon for uninstaller executable.
|
# Set icon for uninstaller executable to be the same as the installer.
|
||||||
set(CPACK_NSIS_MUI_UNIICON "${QTK_RESOURCES}/icons/win/kilroy.ico")
|
set(CPACK_NSIS_MUI_UNIICON "${CPACK_NSIS_MUI_ICON}")
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
# OSX
|
# OSX
|
||||||
# Set icon for the splash image used in OSX DMG installers.
|
# Set icon for the splash image used in OSX DMG installers.
|
||||||
@@ -147,31 +115,31 @@ elseif(APPLE)
|
|||||||
# Set additional options for the OSX bundle.
|
# Set additional options for the OSX bundle.
|
||||||
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
|
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
|
||||||
set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_gui>/Info.plist)
|
set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_gui>/Info.plist)
|
||||||
set(CPACK_BUNDLE_ICON ${QTK_OSX_ICONS})
|
set(CPACK_BUNDLE_ICON "${QTK_OSX_ICONS}")
|
||||||
else(UNIX)
|
else(UNIX)
|
||||||
# Linux
|
# Linux
|
||||||
# Install icons for qtk.
|
# Install icons for qtk.
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-16.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-16.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/16x16/apps
|
DESTINATION /usr/share/icons/hicolor/16x16/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-32.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-32.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/32x32/apps
|
DESTINATION /usr/share/icons/hicolor/32x32/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-48.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-48.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/48x48/apps
|
DESTINATION /usr/share/icons/hicolor/48x48/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-64.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-64.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/64x64/apps
|
DESTINATION /usr/share/icons/hicolor/64x64/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-128.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-128.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/128x128/apps
|
DESTINATION /usr/share/icons/hicolor/128x128/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-256.png
|
install(FILES "${QTK_RESOURCES}/icons/linux/kilroy-256.png"
|
||||||
DESTINATION /usr/share/icons/hicolor/256x256/apps
|
DESTINATION /usr/share/icons/hicolor/256x256/apps
|
||||||
RENAME qtk.png)
|
RENAME qtk.png)
|
||||||
|
|
||||||
# Install the desktop file for qtk.
|
# Install the desktop file for qtk.
|
||||||
install(FILES ${QTK_RESOURCES}/qtk.desktop
|
install(FILES "${QTK_RESOURCES}/qtk.desktop"
|
||||||
DESTINATION /usr/share/applications)
|
DESTINATION /usr/share/applications)
|
||||||
|
|
||||||
# Set additional options for the debian APT package.
|
# Set additional options for the debian APT package.
|
||||||
@@ -179,14 +147,6 @@ else(UNIX)
|
|||||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Remove any assimp components if defined by submodule.
|
|
||||||
if (QTK_SUBMODULES)
|
|
||||||
get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS)
|
|
||||||
list(FILTER CPACK_COMPONENTS_ALL EXCLUDE REGEX .*assimp.*)
|
|
||||||
list(REMOVE_ITEM CPACK_COMPONENTS_ALL Unspecified)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Platform defaults for source bundles.
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(CPACK_SOURCE_GENERATOR ZIP)
|
set(CPACK_SOURCE_GENERATOR ZIP)
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -2,61 +2,44 @@
|
|||||||
## 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 ##
|
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||||
## All Content (c) 2023 Shaun Reed, all rights reserved ##
|
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Qtk Widget Library
|
# Qtk Application
|
||||||
################################################################################
|
################################################################################
|
||||||
# Create a library of widgets used to build Qtk GUI
|
|
||||||
set(
|
# Build without the example scene if QTK_GUI_SCENE is unset.
|
||||||
QTK_PLUGIN_LIBRARY_SOURCES
|
if (QTK_GUI_SCENE)
|
||||||
qtkwidget.cpp
|
set(QTK_GUI_SOURCES
|
||||||
debugconsole.cpp debugconsole.ui
|
|
||||||
toolbox.cpp toolbox.ui
|
|
||||||
treeview.cpp treeview.ui
|
|
||||||
qtkmainwindow.cpp qtkmainwindow.h qtkmainwindow.ui
|
qtkmainwindow.cpp qtkmainwindow.h qtkmainwindow.ui
|
||||||
)
|
# This scene will clone a git repository for required 3D models.
|
||||||
set(
|
|
||||||
QTK_PLUGIN_LIBRARY_HEADERS
|
|
||||||
qtkwidget.h
|
|
||||||
debugconsole.h
|
|
||||||
toolbox.h
|
|
||||||
treeview.h
|
|
||||||
)
|
|
||||||
qt_add_library(qtk_plugin_library STATIC EXCLUDE_FROM_ALL)
|
|
||||||
target_sources(
|
|
||||||
qtk_plugin_library PRIVATE
|
|
||||||
"${QTK_PLUGIN_LIBRARY_SOURCES}"
|
|
||||||
"${QTK_PLUGIN_LIBRARY_HEADERS}"
|
|
||||||
)
|
|
||||||
target_link_libraries(qtk_plugin_library PUBLIC Qt6::UiPlugin qtk_library)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Qtk Widget Plugins
|
|
||||||
################################################################################
|
|
||||||
# Create a Qt Designer plugin for a collection of widgets from our library.
|
|
||||||
qt_add_plugin(qtk_plugins SHARED)
|
|
||||||
target_sources(
|
|
||||||
qtk_plugins PRIVATE
|
|
||||||
widgetplugincollection.cpp widgetplugincollection.h
|
|
||||||
widgetplugin.cpp widgetplugin.h
|
|
||||||
)
|
|
||||||
target_link_libraries(qtk_plugins PUBLIC qtk_plugin_library)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Final Qtk Application
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
set(
|
|
||||||
QTK_GUI_SOURCES
|
|
||||||
qtkscene.cpp qtkscene.h
|
qtkscene.cpp qtkscene.h
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
qt6_add_big_resources(QTK_GUI_SOURCES "${QTK_RESOURCES}/resources.qrc")
|
||||||
|
else()
|
||||||
|
# The scene will use a default skybox with no models or examples.
|
||||||
|
# Models can be added by click-and-dragging an .obj into the scene.
|
||||||
|
set(QTK_GUI_SOURCES
|
||||||
|
qtkmainwindow.cpp qtkmainwindow.h qtkmainwindow.ui
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
qt6_add_big_resources(
|
||||||
|
QTK_GUI_SOURCES
|
||||||
|
"${QTK_RESOURCES}/minimal_resources.qrc"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
qt_add_executable(qtk_gui ${QTK_GUI_SOURCES})
|
qt_add_executable(qtk_gui ${QTK_GUI_SOURCES})
|
||||||
target_link_libraries(qtk_gui PRIVATE qtk_plugin_library)
|
target_link_libraries(qtk_gui PRIVATE qtk_plugin_library)
|
||||||
|
|
||||||
|
if (QTK_GUI_SCENE)
|
||||||
|
target_compile_definitions(qtk_gui PRIVATE -DQTK_GUI_SCENE)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set_target_properties(qtk_gui PROPERTIES WIN32_EXECUTABLE TRUE)
|
set_target_properties(qtk_gui PROPERTIES WIN32_EXECUTABLE TRUE)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
@@ -64,7 +47,7 @@ elseif(APPLE)
|
|||||||
qtk_gui PROPERTIES
|
qtk_gui PROPERTIES
|
||||||
MACOSX_BUNDLE TRUE
|
MACOSX_BUNDLE TRUE
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME Qtk
|
MACOSX_BUNDLE_BUNDLE_NAME Qtk
|
||||||
MACOSX_BUNDLE_ICON_FILE ${QTK_OSX_ICONS}
|
MACOSX_BUNDLE_ICON_FILE "${QTK_OSX_ICONS}"
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER ${CMAKE_PROJECT_NAME}
|
MACOSX_BUNDLE_GUI_IDENTIFIER ${CMAKE_PROJECT_NAME}
|
||||||
MACOSX_BUNDLE_INFO_STRING ${CMAKE_PROJECT_DESCRIPTION}
|
MACOSX_BUNDLE_INFO_STRING ${CMAKE_PROJECT_DESCRIPTION}
|
||||||
MACOSX_BUNDLE_COPYRIGHT ${QTK_COPYRIGHT}
|
MACOSX_BUNDLE_COPYRIGHT ${QTK_COPYRIGHT}
|
||||||
@@ -72,3 +55,46 @@ elseif(APPLE)
|
|||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# qt_generate_deploy_app_script supports Windows and OSX in QtCore >= 6.3.
|
||||||
|
# qt_generate_deploy_app_script is supported on Linux in QtCore >= 6.5.0.
|
||||||
|
if((Qt6_VERSION VERSION_GREATER_EQUAL "6.3.0" AND (WIN32 OR APPLE))
|
||||||
|
OR Qt6_VERSION VERSION_GREATER_EQUAL "6.5.0")
|
||||||
|
install(
|
||||||
|
TARGETS qtk_gui
|
||||||
|
COMPONENT qtk_gui
|
||||||
|
BUNDLE DESTINATION .
|
||||||
|
LIBRARY DESTINATION lib
|
||||||
|
ARCHIVE DESTINATION lib
|
||||||
|
RUNTIME DESTINATION bin
|
||||||
|
)
|
||||||
|
qt_generate_deploy_app_script(
|
||||||
|
TARGET qtk_gui
|
||||||
|
OUTPUT_SCRIPT QTK_DEPLOY_SCRIPT
|
||||||
|
NO_UNSUPPORTED_PLATFORM_ERROR
|
||||||
|
)
|
||||||
|
install(SCRIPT ${QTK_DEPLOY_SCRIPT} COMPONENT qtk_gui)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
if(MSVC AND TARGET Qt6::qmake)
|
||||||
|
get_target_property(QT6_QMAKE_LOCATION Qt6::qmake IMPORTED_LOCATION)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${QT6_QMAKE_LOCATION}" -query QT_INSTALL_PREFIX
|
||||||
|
RESULT_VARIABLE return_code
|
||||||
|
OUTPUT_VARIABLE QT6_INSTALL_PREFIX
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
file(TO_NATIVE_PATH "${QT6_INSTALL_PREFIX}/bin" QT6_INSTALL_PREFIX)
|
||||||
|
|
||||||
|
set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk_gui.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")
|
||||||
|
file(APPEND ${VSUSER_FILE} " <LocalDebuggerEnvironment>Path=$(SolutionDir)\\lib\\$(Configuration);${QT6_INSTALL_PREFIX};$(Path)\n")
|
||||||
|
file(APPEND ${VSUSER_FILE} "$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>\n")
|
||||||
|
file(APPEND ${VSUSER_FILE} " <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n")
|
||||||
|
file(APPEND ${VSUSER_FILE} " </PropertyGroup>\n")
|
||||||
|
file(APPEND ${VSUSER_FILE} "</Project>\n")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
@@ -9,12 +9,10 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
#include "qtkmainwindow.h"
|
#include "qtkmainwindow.h"
|
||||||
#include "qtkscene.h"
|
|
||||||
|
|
||||||
int main(int argc, char * argv[])
|
int main(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
Q_INIT_RESOURCE(resources);
|
initResources();
|
||||||
|
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
auto window = MainWindow::getMainWindow();
|
auto window = MainWindow::getMainWindow();
|
||||||
@@ -24,7 +22,7 @@ int main(int argc, char * argv[])
|
|||||||
// NOTE: We set the scene here and not in QtkMainWindow to detach the scene
|
// NOTE: We set the scene here and not in QtkMainWindow to detach the scene
|
||||||
// from the QtkWidget plugin (qtk_plugin_library build target).
|
// from the QtkWidget plugin (qtk_plugin_library build target).
|
||||||
// Once we can save / load scenes, this call, and QtkScene, can be removed.
|
// Once we can save / load scenes, this call, and QtkScene, can be removed.
|
||||||
window->getQtkWidget()->setScene(new QtkScene);
|
window->setScene(new AppScene);
|
||||||
|
|
||||||
window->show();
|
window->show();
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
|
|||||||
// Initialize static container for all active QtkWidgets
|
// Initialize static container for all active QtkWidgets
|
||||||
auto qtkWidgets = findChildren<Qtk::QtkWidget *>();
|
auto qtkWidgets = findChildren<Qtk::QtkWidget *>();
|
||||||
for (auto & qtkWidget : qtkWidgets) {
|
for (auto & qtkWidget : qtkWidgets) {
|
||||||
|
qtkWidget->setMainWindow(this);
|
||||||
// NOTE: Set a temporary scene for the widget to use for initialization.
|
// NOTE: Set a temporary scene for the widget to use for initialization.
|
||||||
// This should be replaced by loading a scene, or creating a new (unsaved)
|
// This should be replaced by loading a scene, or creating a new (unsaved)
|
||||||
// scene when Qtk is opened.
|
// scene when Qtk is opened.
|
||||||
@@ -39,12 +40,24 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
|
|||||||
&Qtk::Scene::sceneUpdated,
|
&Qtk::Scene::sceneUpdated,
|
||||||
this,
|
this,
|
||||||
&MainWindow::refreshScene);
|
&MainWindow::refreshScene);
|
||||||
|
|
||||||
|
// Update the ToolBox details panel when an item is double-clicked.
|
||||||
connect(qtkWidget,
|
connect(qtkWidget,
|
||||||
&Qtk::QtkWidget::objectFocusChanged,
|
&Qtk::QtkWidget::objectFocusChanged,
|
||||||
ui_->qtk__ToolBox,
|
ui_->qtk__ToolBox,
|
||||||
&Qtk::ToolBox::updateFocus);
|
&Qtk::ToolBox::updateFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(ui_->actionDelete_Object,
|
||||||
|
&QAction::triggered,
|
||||||
|
this,
|
||||||
|
&MainWindow::deleteObject);
|
||||||
|
|
||||||
|
connect(ui_->actionLoad_Model,
|
||||||
|
&QAction::triggered,
|
||||||
|
this,
|
||||||
|
&MainWindow::loadObject);
|
||||||
|
|
||||||
// TODO: Fix / use MainWindow in Qt Designer to add these dock widgets.
|
// TODO: Fix / use MainWindow in Qt Designer to add these dock widgets.
|
||||||
// For now we will add them manually, but we should be able to do this in the
|
// For now we will add them manually, but we should be able to do this in the
|
||||||
// designer. At the moment if you edit the UI in designer the dock widget
|
// designer. At the moment if you edit the UI in designer the dock widget
|
||||||
@@ -59,7 +72,7 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
|
|||||||
ui_->menuView->addAction(ui_->qtk__TreeView->toggleViewAction());
|
ui_->menuView->addAction(ui_->qtk__TreeView->toggleViewAction());
|
||||||
|
|
||||||
// Set the window icon used for Qtk.
|
// Set the window icon used for Qtk.
|
||||||
setWindowIcon(Qtk::getIcon());
|
setWindowIcon(getIcon());
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -100,3 +113,32 @@ void MainWindow::refreshScene(const QString & sceneName)
|
|||||||
// TODO: Select TreeView using sceneName
|
// TODO: Select TreeView using sceneName
|
||||||
ui_->qtk__TreeView->updateView(getQtkWidget()->getScene());
|
ui_->qtk__TreeView->updateView(getQtkWidget()->getScene());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::deleteObject()
|
||||||
|
{
|
||||||
|
if (auto object = ui_->qtk__ToolBox->getObjectFocus(); object != Q_NULLPTR) {
|
||||||
|
auto scene = getQtkWidget()->getScene();
|
||||||
|
switch (object->getType()) {
|
||||||
|
case Qtk::Object::Type::QTK_MESH:
|
||||||
|
scene->removeObject(dynamic_cast<Qtk::MeshRenderer *>(object));
|
||||||
|
ui_->qtk__ToolBox->clearFocus();
|
||||||
|
break;
|
||||||
|
case Qtk::Object::Type::QTK_MODEL:
|
||||||
|
scene->removeObject(dynamic_cast<Qtk::Model *>(object));
|
||||||
|
ui_->qtk__ToolBox->clearFocus();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qDebug() << "Failed to delete model with invalid type";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setScene(Qtk::Scene * scene)
|
||||||
|
{
|
||||||
|
connect(scene,
|
||||||
|
&Qtk::Scene::sceneUpdated,
|
||||||
|
MainWindow::getMainWindow(),
|
||||||
|
&MainWindow::refreshScene);
|
||||||
|
ui_->qtk__QtkWidget->setScene(scene);
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,11 +11,10 @@
|
|||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include <QFileDialog>
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
#include <QPlainTextEdit>
|
|
||||||
|
|
||||||
#include "debugconsole.h"
|
#include "designer-plugins/debugconsole.h"
|
||||||
#include "qtkwidget.h"
|
|
||||||
|
|
||||||
namespace Ui
|
namespace Ui
|
||||||
{
|
{
|
||||||
@@ -50,9 +49,40 @@ namespace Ui
|
|||||||
*/
|
*/
|
||||||
class EmptyScene : public Qtk::Scene
|
class EmptyScene : public Qtk::Scene
|
||||||
{
|
{
|
||||||
void init() override { setSceneName("Empty Scene"); }
|
void init() override
|
||||||
|
{
|
||||||
|
setSkybox(new Qtk::Skybox(":/textures/skybox/right.png",
|
||||||
|
":/textures/skybox/top.png",
|
||||||
|
":/textures/skybox/front.png",
|
||||||
|
":/textures/skybox/left.png",
|
||||||
|
":/textures/skybox/bottom.png",
|
||||||
|
":/textures/skybox/back.png",
|
||||||
|
"Skybox"));
|
||||||
|
setSceneName("Empty Scene");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Conditionally include the QtkScene header if the example is enabled.
|
||||||
|
* Set AppScene type to use in main() for creating the scene.
|
||||||
|
* Define helper function to initialize Qt resources for the application.
|
||||||
|
* These resources are different based on if the example is enabled.
|
||||||
|
*/
|
||||||
|
#ifdef QTK_GUI_SCENE
|
||||||
|
#include "qtkscene.h"
|
||||||
|
using AppScene = QtkScene;
|
||||||
|
inline void initResources()
|
||||||
|
{
|
||||||
|
Q_INIT_RESOURCE(resources);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
using AppScene = EmptyScene;
|
||||||
|
inline void initResources()
|
||||||
|
{
|
||||||
|
Q_INIT_RESOURCE(minimal_resources);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MainWindow class to provide an example of using a QtkWidget within a Qt
|
* MainWindow class to provide an example of using a QtkWidget within a Qt
|
||||||
* window application.
|
* window application.
|
||||||
@@ -97,6 +127,16 @@ class MainWindow : public QMainWindow
|
|||||||
*/
|
*/
|
||||||
Qtk::QtkWidget * getQtkWidget(const QString & name);
|
Qtk::QtkWidget * getQtkWidget(const QString & name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param scene The new scene to view.
|
||||||
|
*/
|
||||||
|
void setScene(Qtk::Scene * scene);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Default icon to use for Qtk desktop application.
|
||||||
|
*/
|
||||||
|
static QIcon getIcon() { return QIcon(":/icons/icon.png"); }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
/**
|
/**
|
||||||
* Trigger a refresh for widgets related to a scene that has been updated.
|
* Trigger a refresh for widgets related to a scene that has been updated.
|
||||||
@@ -104,6 +144,23 @@ class MainWindow : public QMainWindow
|
|||||||
*/
|
*/
|
||||||
void refreshScene(const QString & sceneName);
|
void refreshScene(const QString & sceneName);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a QFileDialog for selecting an object file to load into the scene.
|
||||||
|
*/
|
||||||
|
void loadObject()
|
||||||
|
{
|
||||||
|
const QUrl file = QFileDialog::getOpenFileName(
|
||||||
|
this, tr("Load Model"), QDir::homePath(), tr("Object Files (*.obj)"));
|
||||||
|
getQtkWidget()->getScene()->loadModel(file.fileName().replace(".obj", ""),
|
||||||
|
file.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the currently selected object from the scene.
|
||||||
|
*/
|
||||||
|
void deleteObject();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Private Members
|
* Private Members
|
||||||
|
|||||||
@@ -222,6 +222,9 @@
|
|||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionLoad_Model">
|
<action name="actionLoad_Model">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset>
|
<iconset>
|
||||||
<normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</iconset>
|
<normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</iconset>
|
||||||
@@ -234,6 +237,9 @@
|
|||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDelete_Object">
|
<action name="actionDelete_Object">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset>
|
<iconset>
|
||||||
<normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</iconset>
|
<normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</normaloff>:/icons/fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</iconset>
|
||||||
@@ -310,19 +316,19 @@
|
|||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Qtk::QtkWidget</class>
|
<class>Qtk::QtkWidget</class>
|
||||||
<extends>QOpenGLWidget</extends>
|
<extends>QOpenGLWidget</extends>
|
||||||
<header>qtkwidget.h</header>
|
<header>designer-plugins/qtkwidget.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Qtk::TreeView</class>
|
<class>Qtk::TreeView</class>
|
||||||
<extends>QDockWidget</extends>
|
<extends>QDockWidget</extends>
|
||||||
<header>treeview.h</header>
|
<header>designer-plugins/treeview.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Qtk::ToolBox</class>
|
<class>Qtk::ToolBox</class>
|
||||||
<extends>QDockWidget</extends>
|
<extends>QDockWidget</extends>
|
||||||
<header>toolbox.h</header>
|
<header>designer-plugins/toolbox.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
#include "qtkscene.h"
|
#include "qtkscene.h"
|
||||||
|
|
||||||
using namespace Qtk;
|
using namespace Qtk;
|
||||||
@@ -35,8 +39,38 @@ QtkScene::~QtkScene()
|
|||||||
|
|
||||||
void QtkScene::init()
|
void QtkScene::init()
|
||||||
{
|
{
|
||||||
|
// Clone qtk-resources if it doesn't already exist.
|
||||||
|
QDir repoDir("resources/");
|
||||||
|
if (!repoDir.exists()) {
|
||||||
|
qDebug() << "Cloning qtk-resources repository to " << repoDir.absolutePath()
|
||||||
|
<< "...";
|
||||||
|
|
||||||
|
// Run git clone
|
||||||
|
QProcess gitProcess;
|
||||||
|
gitProcess.setWorkingDirectory(QCoreApplication::applicationDirPath());
|
||||||
|
gitProcess.start("git",
|
||||||
|
{"clone",
|
||||||
|
"https://git.shaunreed.com/shaunrd0/qtk-resources.git",
|
||||||
|
repoDir.absolutePath()});
|
||||||
|
|
||||||
|
// Wait indefinitely for the process to complete
|
||||||
|
gitProcess.waitForFinished(-1);
|
||||||
|
// Check the result
|
||||||
|
if (gitProcess.exitCode() == 0) {
|
||||||
|
qDebug() << "Repository cloned successfully.";
|
||||||
|
} else {
|
||||||
|
qDebug() << "Git clone failed:" << gitProcess.readAllStandardError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add a skybox to the scene using default cube map images and settings.
|
// Add a skybox to the scene using default cube map images and settings.
|
||||||
setSkybox(new Qtk::Skybox("Skybox"));
|
setSkybox(new Qtk::Skybox(":/textures/skybox/right.png",
|
||||||
|
":/textures/skybox/top.png",
|
||||||
|
":/textures/skybox/front.png",
|
||||||
|
":/textures/skybox/left.png",
|
||||||
|
":/textures/skybox/bottom.png",
|
||||||
|
":/textures/skybox/back.png",
|
||||||
|
"Skybox"));
|
||||||
|
|
||||||
/* Create a red cube with a mini master chief on top. */
|
/* Create a red cube with a mini master chief on top. */
|
||||||
auto myCube = new MeshRenderer("My cube", Cube(Qtk::QTK_DRAW_ELEMENTS));
|
auto myCube = new MeshRenderer("My cube", Cube(Qtk::QTK_DRAW_ELEMENTS));
|
||||||
@@ -44,8 +78,7 @@ void QtkScene::init()
|
|||||||
myCube->getTransform().setTranslation(5.0f, 0.0f, 0.0f);
|
myCube->getTransform().setTranslation(5.0f, 0.0f, 0.0f);
|
||||||
addObject(myCube);
|
addObject(myCube);
|
||||||
|
|
||||||
auto mySpartan =
|
auto mySpartan = new Model("My spartan", QTK_SPARTAN);
|
||||||
new Model("My spartan", ":/models/models/spartan/spartan.obj");
|
|
||||||
mySpartan->getTransform().setTranslation(5.0f, 0.5f, 0.0f);
|
mySpartan->getTransform().setTranslation(5.0f, 0.5f, 0.0f);
|
||||||
mySpartan->getTransform().setScale(0.5f);
|
mySpartan->getTransform().setScale(0.5f);
|
||||||
addObject(mySpartan);
|
addObject(mySpartan);
|
||||||
@@ -82,31 +115,27 @@ void QtkScene::init()
|
|||||||
//
|
//
|
||||||
// 3D Model loading
|
// 3D Model loading
|
||||||
|
|
||||||
auto model = addObject(
|
auto model = addObject(new Qtk::Model("backpack", QTK_BACKPACK));
|
||||||
new Qtk::Model("backpack", ":/models/models/backpack/backpack.obj"));
|
|
||||||
// Sometimes model textures need flipped in certain directions
|
// Sometimes model textures need flipped in certain directions
|
||||||
model->flipTexture("diffuse.jpg", false, true);
|
model->flipTexture("diffuse.jpg", false, true);
|
||||||
model->getTransform().setTranslation(0.0f, 0.0f, -10.0f);
|
model->getTransform().setTranslation(0.0f, 0.0f, -10.0f);
|
||||||
|
|
||||||
model = addObject(new Qtk::Model("bird", ":/models/models/bird/bird.obj"));
|
model = addObject(new Qtk::Model("bird", QTK_BIRD));
|
||||||
model->getTransform().setTranslation(2.0f, 2.0f, -10.0f);
|
model->getTransform().setTranslation(2.0f, 2.0f, -10.0f);
|
||||||
// Sometimes the models are very large
|
// Sometimes the models are very large
|
||||||
model->getTransform().scale(0.0025f);
|
model->getTransform().scale(0.0025f);
|
||||||
model->getTransform().rotate(-110.0f, 0.0f, 1.0f, 0.0f);
|
model->getTransform().rotate(-110.0f, 0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
model = addObject(
|
model = addObject(new Qtk::Model("alien", QTK_ALIEN));
|
||||||
new Qtk::Model("alien", ":/models/models/alien-hominid/alien.obj"));
|
|
||||||
model->getTransform().setTranslation(2.0f, -1.0f, -5.0f);
|
model->getTransform().setTranslation(2.0f, -1.0f, -5.0f);
|
||||||
model->getTransform().scale(0.15f);
|
model->getTransform().scale(0.15f);
|
||||||
|
|
||||||
model = addObject(
|
model = addObject(new Qtk::Model("My scythe", QTK_SCYTHE));
|
||||||
new Qtk::Model("My scythe", ":/models/models/scythe/scythe.obj"));
|
|
||||||
model->getTransform().setTranslation(-6.0f, 0.0f, -10.0f);
|
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, 1.0f, 0.0f, 0.0f);
|
||||||
model->getTransform().rotate(90.0f, 0.0f, 1.0f, 0.0f);
|
model->getTransform().rotate(90.0f, 0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
model = addObject(
|
model = addObject(new Qtk::Model("masterChief", QTK_SPARTAN));
|
||||||
new Qtk::Model("masterChief", ":/models/models/spartan/spartan.obj"));
|
|
||||||
model->getTransform().setTranslation(-1.5f, 0.5f, -2.0f);
|
model->getTransform().setTranslation(-1.5f, 0.5f, -2.0f);
|
||||||
|
|
||||||
|
|
||||||
@@ -232,7 +261,7 @@ void QtkScene::init()
|
|||||||
|
|
||||||
/* Test alien Model with phong lighting and specular mapping. */
|
/* Test alien Model with phong lighting and specular mapping. */
|
||||||
model = addObject(new Qtk::Model("alienTest",
|
model = addObject(new Qtk::Model("alienTest",
|
||||||
":/models/models/alien-hominid/alien.obj",
|
QTK_ALIEN,
|
||||||
":/shaders/model-phong.vert",
|
":/shaders/model-phong.vert",
|
||||||
":/shaders/model-phong.frag"));
|
":/shaders/model-phong.frag"));
|
||||||
model->getTransform().setTranslation(3.0f, -1.0f, 10.0f);
|
model->getTransform().setTranslation(3.0f, -1.0f, 10.0f);
|
||||||
@@ -259,7 +288,7 @@ void QtkScene::init()
|
|||||||
|
|
||||||
/* Test spartan Model with phong lighting, specular and normal mapping. */
|
/* Test spartan Model with phong lighting, specular and normal mapping. */
|
||||||
model = addObject(new Qtk::Model("spartanTest",
|
model = addObject(new Qtk::Model("spartanTest",
|
||||||
":/models/models/spartan/spartan.obj",
|
QTK_SPARTAN,
|
||||||
":/shaders/model-phong.vert",
|
":/shaders/model-phong.vert",
|
||||||
":/shaders/model-phong.frag"));
|
":/shaders/model-phong.frag"));
|
||||||
model->getTransform().setTranslation(0.0f, -1.0f, 10.0f);
|
model->getTransform().setTranslation(0.0f, -1.0f, 10.0f);
|
||||||
@@ -397,6 +426,7 @@ void QtkScene::draw()
|
|||||||
// WARNING: We must call the base class draw() function first.
|
// WARNING: We must call the base class draw() function first.
|
||||||
// + This will handle rendering core scene components like the Skybox.
|
// + This will handle rendering core scene components like the Skybox.
|
||||||
Scene::draw();
|
Scene::draw();
|
||||||
|
const QVector3D cameraPosition = getCamera().getTransform().getTranslation();
|
||||||
|
|
||||||
mTestPhong->bindShaders();
|
mTestPhong->bindShaders();
|
||||||
mTestPhong->setUniform("uModelInverseTransposed",
|
mTestPhong->setUniform("uModelInverseTransposed",
|
||||||
@@ -404,14 +434,12 @@ void QtkScene::draw()
|
|||||||
mTestPhong->setUniform(
|
mTestPhong->setUniform(
|
||||||
"uLightPosition",
|
"uLightPosition",
|
||||||
MeshRenderer::getInstance("phongLight")->getTransform().getTranslation());
|
MeshRenderer::getInstance("phongLight")->getTransform().getTranslation());
|
||||||
mTestPhong->setUniform("uCameraPosition",
|
mTestPhong->setUniform("uCameraPosition", cameraPosition);
|
||||||
QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
mTestPhong->releaseShaders();
|
mTestPhong->releaseShaders();
|
||||||
mTestPhong->draw();
|
mTestPhong->draw();
|
||||||
|
|
||||||
mTestAmbient->bindShaders();
|
mTestAmbient->bindShaders();
|
||||||
mTestAmbient->setUniform(
|
mTestAmbient->setUniform("uCameraPosition", cameraPosition);
|
||||||
"uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
mTestAmbient->releaseShaders();
|
mTestAmbient->releaseShaders();
|
||||||
mTestAmbient->draw();
|
mTestAmbient->draw();
|
||||||
|
|
||||||
@@ -423,8 +451,7 @@ void QtkScene::draw()
|
|||||||
MeshRenderer::getInstance("diffuseLight")
|
MeshRenderer::getInstance("diffuseLight")
|
||||||
->getTransform()
|
->getTransform()
|
||||||
.getTranslation());
|
.getTranslation());
|
||||||
mTestDiffuse->setUniform(
|
mTestDiffuse->setUniform("uCameraPosition", cameraPosition);
|
||||||
"uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
mTestDiffuse->releaseShaders();
|
mTestDiffuse->releaseShaders();
|
||||||
mTestDiffuse->draw();
|
mTestDiffuse->draw();
|
||||||
|
|
||||||
@@ -436,67 +463,70 @@ void QtkScene::draw()
|
|||||||
MeshRenderer::getInstance("specularLight")
|
MeshRenderer::getInstance("specularLight")
|
||||||
->getTransform()
|
->getTransform()
|
||||||
.getTranslation());
|
.getTranslation());
|
||||||
mTestSpecular->setUniform(
|
mTestSpecular->setUniform("uCameraPosition", cameraPosition);
|
||||||
"uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
mTestSpecular->releaseShaders();
|
mTestSpecular->releaseShaders();
|
||||||
mTestSpecular->draw();
|
mTestSpecular->draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtkScene::update()
|
void QtkScene::update()
|
||||||
{
|
{
|
||||||
auto mySpartan = Model::getInstance("My spartan");
|
auto getModel = Model::getInstance;
|
||||||
|
const QVector3D cameraPosition = getCamera().getTransform().getTranslation();
|
||||||
|
|
||||||
|
// Models may have failed to load, so we should check before accessing.
|
||||||
|
if (auto mySpartan = getModel("My spartan"); mySpartan) {
|
||||||
mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
auto myCube = MeshRenderer::getInstance("My cube");
|
if (auto myCube = getModel("My cube"); myCube) {
|
||||||
myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f);
|
myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
auto position = MeshRenderer::getInstance("alienTestLight")
|
QMatrix4x4 posMatrix;
|
||||||
->getTransform()
|
if (auto alien = getModel("alienTest"); alien) {
|
||||||
.getTranslation();
|
alien->setLightPosition("alienTestLight");
|
||||||
auto alien = Model::getInstance("alienTest");
|
|
||||||
alien->setUniform("uLight.position", position);
|
alien->setUniform("uCameraPosition", cameraPosition);
|
||||||
alien->setUniform("uCameraPosition",
|
posMatrix = alien->getTransform().toMatrix();
|
||||||
QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
auto posMatrix = alien->getTransform().toMatrix();
|
|
||||||
alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||||
alien->setUniform("uMVP.model", posMatrix);
|
alien->setUniform("uMVP.model", posMatrix);
|
||||||
alien->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
alien->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||||
alien->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
alien->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||||
alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
position = MeshRenderer::getInstance("spartanTestLight")
|
if (auto spartan = getModel("spartanTest"); spartan) {
|
||||||
->getTransform()
|
spartan->setLightPosition("spartanTestLight");
|
||||||
.getTranslation();
|
|
||||||
auto spartan = Model::getInstance("spartanTest");
|
spartan->setUniform("uCameraPosition", cameraPosition);
|
||||||
spartan->setUniform("uLight.position", position);
|
|
||||||
spartan->setUniform("uCameraPosition",
|
|
||||||
QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
posMatrix = spartan->getTransform().toMatrix();
|
posMatrix = spartan->getTransform().toMatrix();
|
||||||
spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||||
spartan->setUniform("uMVP.model", posMatrix);
|
spartan->setUniform("uMVP.model", posMatrix);
|
||||||
spartan->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
spartan->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||||
spartan->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
spartan->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||||
spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto phong = getModel("testPhong"); phong) {
|
||||||
|
phong->setLightPosition("testLight");
|
||||||
|
|
||||||
auto phong = MeshRenderer::getInstance("testPhong");
|
|
||||||
phong->getTransform().rotate(0.75f, 1.0f, 0.5f, 0.0f);
|
phong->getTransform().rotate(0.75f, 1.0f, 0.5f, 0.0f);
|
||||||
phong->bindShaders();
|
phong->bindShaders();
|
||||||
position =
|
phong->setUniform("uCameraPosition", cameraPosition);
|
||||||
MeshRenderer::getInstance("testLight")->getTransform().getTranslation();
|
|
||||||
phong->setUniform("uLight.position", position);
|
|
||||||
phong->setUniform("uCameraPosition",
|
|
||||||
QtkScene::getCamera().getTransform().getTranslation());
|
|
||||||
posMatrix = phong->getTransform().toMatrix();
|
posMatrix = phong->getTransform().toMatrix();
|
||||||
phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||||
phong->setUniform("uMVP.model", posMatrix);
|
phong->setUniform("uMVP.model", posMatrix);
|
||||||
phong->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
phong->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
|
||||||
phong->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
phong->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
|
||||||
phong->releaseShaders();
|
phong->releaseShaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
// MeshRenderers are lower level opengl objects baked into the source code.
|
||||||
|
auto getMesh = MeshRenderer::getInstance;
|
||||||
|
|
||||||
// Rotate lighting example cubes
|
// Rotate lighting example cubes
|
||||||
mTestPhong->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
mTestPhong->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||||
MeshRenderer::getInstance("noLight")->getTransform().rotate(
|
getMesh("noLight")->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||||
0.75f, 0.5f, 0.3f, 0.2f);
|
|
||||||
mTestAmbient->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
mTestAmbient->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||||
mTestDiffuse->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
mTestDiffuse->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||||
mTestSpecular->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
mTestSpecular->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||||
@@ -504,46 +534,27 @@ void QtkScene::update()
|
|||||||
// Examples of various translations and rotations
|
// Examples of various translations and rotations
|
||||||
|
|
||||||
// Rotate in multiple directions simultaneously
|
// Rotate in multiple directions simultaneously
|
||||||
MeshRenderer::getInstance("rgbNormalsCube")
|
getMesh("rgbNormalsCube")->getTransform().rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
||||||
->getTransform()
|
|
||||||
.rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
|
||||||
|
|
||||||
// Pitch forward and roll sideways
|
// Pitch forward and roll sideways
|
||||||
MeshRenderer::getInstance("leftTriangle")
|
getMesh("leftTriangle")->getTransform().rotate(0.75f, 1.0f, 0.0f, 0.0f);
|
||||||
->getTransform()
|
getMesh("rightTriangle")->getTransform().rotate(0.75f, 0.0f, 0.0f, 1.0f);
|
||||||
.rotate(0.75f, 1.0f, 0.0f, 0.0f);
|
|
||||||
MeshRenderer::getInstance("rightTriangle")
|
|
||||||
->getTransform()
|
|
||||||
.rotate(0.75f, 0.0f, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
// Move between two positions over time
|
// Move between two positions over time
|
||||||
static float translateX = 0.025f;
|
static float translateX = 0.025f;
|
||||||
float limit = -9.0f; // Origin position.x - 2.0f
|
float limit = -9.0f; // Origin position.x - 2.0f
|
||||||
float posX = MeshRenderer::getInstance("topTriangle")
|
float posX = getMesh("topTriangle")->getTransform().getTranslation().x();
|
||||||
->getTransform()
|
|
||||||
.getTranslation()
|
|
||||||
.x();
|
|
||||||
if (posX < limit || posX > limit + 4.0f) {
|
if (posX < limit || posX > limit + 4.0f) {
|
||||||
translateX = -translateX;
|
translateX = -translateX;
|
||||||
}
|
}
|
||||||
MeshRenderer::getInstance("topTriangle")
|
getMesh("topTriangle")->getTransform().translate(translateX, 0.0f, 0.0f);
|
||||||
->getTransform()
|
getMesh("bottomTriangle")->getTransform().translate(-translateX, 0.0f, 0.0f);
|
||||||
.translate(translateX, 0.0f, 0.0f);
|
|
||||||
MeshRenderer::getInstance("bottomTriangle")
|
|
||||||
->getTransform()
|
|
||||||
.translate(-translateX, 0.0f, 0.0f);
|
|
||||||
// And lets rotate the triangles in two directions at once
|
// And lets rotate the triangles in two directions at once
|
||||||
MeshRenderer::getInstance("topTriangle")
|
getMesh("topTriangle")->getTransform().rotate(0.75f, 0.2f, 0.0f, 0.4f);
|
||||||
->getTransform()
|
getMesh("bottomTriangle")->getTransform().rotate(0.75f, 0.0f, 0.2f, 0.4f);
|
||||||
.rotate(0.75f, 0.2f, 0.0f, 0.4f);
|
|
||||||
MeshRenderer::getInstance("bottomTriangle")
|
|
||||||
->getTransform()
|
|
||||||
.rotate(0.75f, 0.0f, 0.2f, 0.4f);
|
|
||||||
// And make the bottom triangle green, instead of RGB
|
// And make the bottom triangle green, instead of RGB
|
||||||
|
|
||||||
// Rotate center cube in several directions simultaneously
|
// Rotate center cube in several directions simultaneously
|
||||||
// + Not subject to gimbal lock since we are using quaternions :)
|
// + Not subject to gimbal lock since we are using quaternions :)
|
||||||
MeshRenderer::getInstance("centerCube")
|
getMesh("centerCube")->getTransform().rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
||||||
->getTransform()
|
|
||||||
.rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
|
|
||||||
#include <qtk/scene.h>
|
#include <qtk/scene.h>
|
||||||
|
|
||||||
|
#define QTK_SPARTAN "resources/models/spartan/spartan.obj"
|
||||||
|
#define QTK_BACKPACK "resources/models/backpack/backpack.obj"
|
||||||
|
#define QTK_BIRD "resources/models/bird/bird.obj"
|
||||||
|
#define QTK_ALIEN "resources/models/alien-hominid/alien.obj"
|
||||||
|
#define QTK_SCYTHE "resources/models/scythe/scythe.obj"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example scene using QtkWidget to render 3D models and simple geometry within
|
* Example scene using QtkWidget to render 3D models and simple geometry within
|
||||||
* QtOpenGLWidgets. This scene also shows some examples of using GLSL shaders to
|
* QtOpenGLWidgets. This scene also shows some examples of using GLSL shaders to
|
||||||
|
|||||||