diff --git a/.github/workflows/all-builds.yml b/.github/workflows/all-builds.yml index efacc92..5b128d7 100644 --- a/.github/workflows/all-builds.yml +++ b/.github/workflows/all-builds.yml @@ -13,11 +13,11 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] include: - os: ubuntu-latest - cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" + cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.5.0/gcc_64/" - os: windows-latest - cmake: -DCMAKE_PREFIX_PATH="D:/a/qtk/qtk/Qt/6.3.1/mingw81_64/" + cmake: -DCMAKE_PREFIX_PATH="D:/a/qtk/qtk/Qt/6.5.0/mingw81_64/" - os: macos-latest - cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" + cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.5.0/gcc_64/" runs-on: ${{ matrix.os }} steps: @@ -26,19 +26,47 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v2 with: - version: '6.3.1' + version: '6.5.0' - name: Chocolatey Action if: matrix.os == 'windows-latest' - uses: crazy-max/ghaction-chocolatey@v2.0.0 + uses: crazy-max/ghaction-chocolatey@v2 with: - args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1 + args: install pkgconfiglite - name: Build Qtk shell: bash run: | - cmake -S . -B build/ ${{ matrix.cmake }} -DQTK_UPDATE_SUBMODULES=ON && cmake --build build/ \ - --target qtk-main + cmake -B build/ ${{ matrix.cmake }} -DQTK_UPDATE_SUBMODULES=ON + cmake --build build/ + + - name: Package Qtk + shell: bash + run: | + cmake --build build/ --target package + + - name: Package Qtk Sources + if: matrix.os != 'macos-latest' + shell: bash + run: | + cmake --build build/ --target package_source + + - uses: actions/upload-artifact@v3 + with: + name: qtk-packages-${{ matrix.os }} + path: | + build/packages/ + !build/packages/_CPack_Packages/* + + - name: Install Qtk + shell: bash + run: | + cmake --install build/ + + - uses: actions/upload-artifact@v3 + with: + name: qtk-${{ matrix.os }} + path: install/* Build-Qtk-Assimp-Targets: strategy: @@ -47,9 +75,9 @@ jobs: os: [ubuntu-latest, macos-latest] include: - os: ubuntu-latest - cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" + cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.5.0/gcc_64/" - os: macos-latest - cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" -DASSIMP_NEW_INTERFACE=ON + cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.5.0/gcc_64/" -DASSIMP_NEW_INTERFACE=ON runs-on: ${{ matrix.os }} steps: @@ -58,7 +86,7 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v2 with: - version: '6.3.1' + version: '6.5.0' - name: Install Assimp MacOS if: matrix.os == 'macos-latest' @@ -75,5 +103,49 @@ jobs: - name: Build Qtk shell: bash run: | - cmake -S . -B build/ ${{ matrix.cmake }} && cmake --build build/ \ - --target qtk-main + cmake -B build/ ${{ matrix.cmake }} && cmake --build build/ --target qtk-main + + # TODO: Enable with tag only when done testing +# Release-Qtk: +# needs: Build-Qtk +# if: "always()" +# strategy: +# fail-fast: false +# matrix: +# os: [ubuntu-latest, windows-latest, macos-latest] +# include: +# - os: ubuntu-latest +# cqt: CQtDeployer.deb +# url: https://github.com/QuasarApp/CQtDeployer/releases/download/v1.6.2277/CQtDeployer_1.6.2277.ecc6eed_Linux_x86_64.deb +# qmake: /home/runner/work/qtk/Qt/6.5.0/gcc_64/bin/qmake +# - os: windows-latest +# cqt: CQtDeployer.exe +# url: https://github.com/QuasarApp/CQtDeployer/releases/download/v1.6.2277/CQtDeployer_1.6.2277.ecc6eed_Windows_AMD64.exe +# qmake: D:/a/qtk/qtk/Qt/6.5.0/mingw81_64/bin/qmake +# - os: macos-latest +# cqt: CQtDeployer.run +# url: https://github.com/QuasarApp/CQtDeployer/releases/download/v1.6.2277/CQtDeployer_1.6.2277.ecc6eed_Linux_x86_64.run +# qmake: /home/runner/work/qtk/Qt/6.5.0/gcc_64/bin/qmake +# runs-on: ${{ matrix.os }} +# +# steps: +# - uses: actions/download-artifact@v3 +# with: +# name: qtk-${{ matrix.os }} +# +# - name: Install Qt +# uses: jurplel/install-qt-action@v2 +# with: +# version: '6.5.0' +# +# - name: Package Qtk +# shell: bash +# run: | +# wget -O ${{ matrix.cqt }} ${{ matrix.url }} +# apt install -y ./${{ matrix.cqt }} +# cqtdeployer -bin qtk-main -qmake ${{ matrix.qmake }} +# +# - uses: actions/upload-artifact@v3 +# with: +# name: qtk-installer-${{ matrix.os }} +# path: DistributionKit/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 814ddcd..adf920d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ option( OFF ) -set(QT_DIR "$ENV{HOME}/Code/Clones/Qt/" CACHE PATH "Path to Qt6") +set(QT_DIR "$ENV{HOME}/Qt/" CACHE PATH "Path to Qt6") # Qt Designer will look in different locations if WIN / Unix. # These paths are for using Qt Designer integrated within Qt Creator. @@ -70,7 +70,7 @@ else() endif() # This should be set to your Qt6 installation directory. -set(QT_INSTALL_DIR "${QT_DIR}/6.3.1/gcc_64/" CACHE PATH "Path to Qt6 install") +set(QT_INSTALL_DIR "${QT_DIR}/6.5.0/gcc_64" CACHE PATH "Path to Qt6 install") # Point CMAKE_PREFIX_PATH to Qt6 install directory # If Qtk is built within Qt Creator this is not required. list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}") @@ -98,6 +98,7 @@ endforeach() ################################################################################ # Find Qt find_package(Qt6 COMPONENTS Core UiPlugin OpenGLWidgets) +qt_standard_project_setup() if(NOT Qt6_FOUND) message( SEND_ERROR "[Qtk] Error: Unable to find Qt6 at CMAKE_PREFIX_PATH: " @@ -113,6 +114,8 @@ endif() # Find Assimp if(QTK_UPDATE_SUBMODULES) message(STATUS "[Qtk] Updating submodules...") + set(ASSIMP_BUILD_TESTS OFF) + set(ASSIMP_INSTALL OFF) submodule_update("${CMAKE_CURRENT_SOURCE_DIR}/extern/assimp/assimp/") add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/extern/assimp/assimp/") else() @@ -127,37 +130,3 @@ endif() # Qtk ################################################################################ add_subdirectory(src) - -if(WIN32) - 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) - - if(TARGET Qt6::windeployqt) - add_custom_command( - TARGET qtk-main - POST_BUILD - COMMAND set PATH=%PATH%$${qt6_install_prefix} - COMMAND Qt6::windeployqt --dir "${CMAKE_BINARY_DIR}/windeployqt" "$/$" - ) - install(DIRECTORY "${CMAKE_BINARY_DIR}/windeployqt/" DESTINATION bin) - endif() - - if(MSVC AND TARGET Qt6::qmake) - set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk-main.vcxproj.user") - file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/extern/assimp/assimp/bin" assimp_bin) - file(WRITE ${VSUSER_FILE} "\n") - file(APPEND ${VSUSER_FILE} "\n") - file(APPEND ${VSUSER_FILE} " \n") - file(APPEND ${VSUSER_FILE} " Path=$(SolutionDir)\\lib\\$(Configuration);${qt6_install_prefix};${assimp_bin};$(Path)\n") - file(APPEND ${VSUSER_FILE} "$(LocalDebuggerEnvironment)\n") - file(APPEND ${VSUSER_FILE} " WindowsLocalDebugger\n") - file(APPEND ${VSUSER_FILE} " \n") - file(APPEND ${VSUSER_FILE} "\n") - endif() -endif() diff --git a/README.md b/README.md index 29feaaa..68e7956 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Key features that are planned: * Save / load for scene data. The current inheritance model is temporary. * Basic text editor for quickly modifying shaders attached to objects. * Shader / object properties panel to modify related settings. + * Reduce size of application resources and git references. The Qtk desktop application provides a model loader using [Assimp](https://assimp.org/) within a Qt widget application. @@ -33,8 +34,8 @@ and see some examples in the `resources/models/` directory. Qtk was developed and tested using CLion and [Qt Creator](https://github.com/qt-creator/qt-creator). Simply open the root `CMakeLists.txt` with either of these editors and configurations will be loaded. -This project has been ported to Qt6, which is not yet available in Ubuntu apt repositories. -To run this project, you will *need* to install [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer) for your system. +This project has been ported to **Qt 6.5.0**, which is not yet available in Ubuntu apt repositories. +To run this project, you will *need* to install [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer) for your system, **version 6.5.0** or later. Be sure to take note of the Qt6 installation directory, as we will need it to correctly set our `CMAKE_PREFIX_PATH` in the next steps. #### Linux @@ -101,6 +102,13 @@ If you see a small triangle floating by a model it represents the light source that is being used for the shader rendering the model. These appear on models using phong, specular, and diffuse lighting techniques. +Object names can be double-clicked in the tree view panel for quick camera +navigation. All panels and toolbars are dockable widgets that can be popped out +and reorganized as needed. Panels can be stacked to create a docked widget with +tabs. The central widget that provides the camera view into the scene cannot be +detached from the main window in this way. See the `View` menu to enable debug +console widgets for open scenes or reopen previously closed panels. + ![](resources/screenshot.png) Spartan with no normals - diff --git a/extern/assimp/assimp b/extern/assimp/assimp index bd64cc8..eb328ce 160000 --- a/extern/assimp/assimp +++ b/extern/assimp/assimp @@ -1 +1 @@ -Subproject commit bd64cc88dff17f118ecf32ebcbacaf566f6b6449 +Subproject commit eb328ce69dd7b06977aed125e967a41e835b8431 diff --git a/resources/screenshot.png b/resources/screenshot.png index d8729df..2802538 100644 Binary files a/resources/screenshot.png and b/resources/screenshot.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0bc7a2..9a5820e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,4 +41,11 @@ set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") set(CPACK_PACKAGE_VENDOR "Shaun Reed") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Qt OpenGL 3D graphics library.") set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/shaunrd0/qtk") +set(CPACK_SOURCE_IGNORE_FILES build;install;\.git;\.github;\.idea) +set(CPACK_PACKAGE_DIRECTORY packages/) +if(WIN32) + set(CPACK_SOURCE_GENERATOR ZIP) +else() + set(CPACK_SOURCE_GENERATOR TGZ) +endif() include(CPack) diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 4b7df6a..758f034 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -11,13 +11,16 @@ # Create a library of widgets used to build Qtk GUI set( QTK_PLUGIN_LIBRARY_SOURCES - qtkwidget.cpp qtkwidget.h + qtkwidget.cpp debugconsole.cpp debugconsole.ui toolbox.cpp toolbox.ui treeview.cpp treeview.ui + qtkmainwindow.cpp qtkmainwindow.ui ) set( QTK_PLUGIN_LIBRARY_HEADERS + qtkmainwindow.h + qtkwidget.h debugconsole.h toolbox.h treeview.h @@ -72,12 +75,9 @@ install( set( QTK_APP_SOURCES examplescene.cpp examplescene.h - qtkmainwindow.cpp qtkmainwindow.ui - qtkmainwindow.h main.cpp ) -# TODO: Qtk library should not depend on these resources. (qtkapi.h) -# Or should some resources be installed somewhere? + qt6_add_resources(QTK_APP_SOURCES "${QTK_RESOURCES}/resources.qrc") configure_file( resources.h.in @@ -102,3 +102,44 @@ install( RUNTIME DESTINATION bin LIBRARY DESTINATION bin/lib ) + +qt_generate_deploy_app_script( + TARGET qtk-main + FILENAME_VARIABLE deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR +) +install(SCRIPT ${deploy_script}) + +if(WIN32) + 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) + + if(TARGET Qt6::windeployqt) + add_custom_command( + TARGET qtk-main + POST_BUILD + COMMAND set PATH=%PATH%$${qt6_install_prefix} + COMMAND Qt6::windeployqt --dir "${CMAKE_BINARY_DIR}/windeployqt" "$/$" + ) + install(DIRECTORY "${CMAKE_BINARY_DIR}/windeployqt/" DESTINATION bin) + endif() + + if(MSVC AND TARGET Qt6::qmake) + set(VSUSER_FILE "${CMAKE_CURRENT_BINARY_DIR}/qtk-main.vcxproj.user") + file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/extern/assimp/assimp/bin" assimp_bin) + file(WRITE ${VSUSER_FILE} "\n") + file(APPEND ${VSUSER_FILE} "\n") + file(APPEND ${VSUSER_FILE} " \n") + file(APPEND ${VSUSER_FILE} " Path=$(SolutionDir)\\lib\\$(Configuration);${qt6_install_prefix};${assimp_bin};$(Path)\n") + file(APPEND ${VSUSER_FILE} "$(LocalDebuggerEnvironment)\n") + file(APPEND ${VSUSER_FILE} " WindowsLocalDebugger\n") + file(APPEND ${VSUSER_FILE} " \n") + file(APPEND ${VSUSER_FILE} "\n") + endif() +endif() diff --git a/src/app/qtkmainwindow.cpp b/src/app/qtkmainwindow.cpp index cea68eb..f36a328 100644 --- a/src/app/qtkmainwindow.cpp +++ b/src/app/qtkmainwindow.cpp @@ -6,8 +6,8 @@ ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ##############################################################################*/ -#include "examplescene.h" #include "qtkmainwindow.h" +#include "examplescene.h" #include "ui_qtkmainwindow.h" MainWindow * MainWindow::mainWindow_ = Q_NULLPTR; diff --git a/src/qtk/qtkapi.h b/src/qtk/qtkapi.h index ab4cb60..15a74c3 100644 --- a/src/qtk/qtkapi.h +++ b/src/qtk/qtkapi.h @@ -27,7 +27,9 @@ * This cannot be defined within any namespace, but can be called by ctors. * See object.h for example. */ -inline void initResources() { Q_INIT_RESOURCE(resources); } +inline void initResources() { + Q_INIT_RESOURCE(resources); +} namespace Qtk { /**