Compare commits
	
		
			2 Commits
		
	
	
		
			8dc5d82c8d
			...
			675082ab83
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 675082ab83 | |||
| ea25ba312a | 
							
								
								
									
										4
									
								
								.github/workflows/all-builds.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@ -220,7 +220,7 @@ jobs:
 | 
			
		||||
        if: matrix.os == 'windows-latest'
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: qtk-${{ matrix.os }}
 | 
			
		||||
          name: libqtk-${{ matrix.os }}
 | 
			
		||||
          path: |
 | 
			
		||||
            build/packages/*.exe
 | 
			
		||||
 | 
			
		||||
@ -235,7 +235,7 @@ jobs:
 | 
			
		||||
        if: matrix.os == 'macos-latest'
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: qtk-${{ matrix.os }}
 | 
			
		||||
          name: libqtk-${{ matrix.os }}
 | 
			
		||||
          path: |
 | 
			
		||||
            build/packages/*.tar.gz
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -83,6 +83,8 @@ endif ()
 | 
			
		||||
 | 
			
		||||
set(QTK_RESOURCES "${CMAKE_SOURCE_DIR}/resources")
 | 
			
		||||
set(QTK_OSX_ICONS ${CMAKE_SOURCE_DIR}/resources/icons/osx/kilroy.icns)
 | 
			
		||||
string(TIMESTAMP YEAR "%Y")
 | 
			
		||||
set(QTK_COPYRIGHT "All Content © 2021-${YEAR} Shaun Reed, all rights reserved.")
 | 
			
		||||
 | 
			
		||||
# Point CMAKE_PREFIX_PATH to Qt6 install directory
 | 
			
		||||
# If Qtk is built within Qt Creator this is not required.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										66
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@ -9,38 +9,53 @@ 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.
 | 
			
		||||
You can fly around the scene using WASD while holding down the right mouse button.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
All side panels and toolbars are dockable widgets that can be popped out
 | 
			
		||||
and reorganized as needed. Panels can also 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.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
The default scene contains basic examples like texture mapping to make a crate from basic cube geometry
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Examples of Ambient, Diffuse, and Specular GLSL shaders.
 | 
			
		||||
 | 
			
		||||
| Ambient                                               | Diffuse                                               | Specular                                               |
 | 
			
		||||
|-------------------------------------------------------|-------------------------------------------------------|--------------------------------------------------------|
 | 
			
		||||
| <img src="resources/screenshots/screen-ambient.png"/> | <img src="resources/screenshots/screen-diffuse.png"/> | <img src="resources/screenshots/screen-specular.png"/> |
 | 
			
		||||
 | 
			
		||||
And more advanced techniques like Phong lighting (ambient + diffuse + specular) and normal mapping.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
| Normal Mapping Disabled                              | Normal Mapping Enabled                                 | 
 | 
			
		||||
|------------------------------------------------------|--------------------------------------------------------|
 | 
			
		||||
| <img src="resources/screenshots/spartan-phong.png"/> | <img src="resources/screenshots/spartan-normals.png"/> |
 | 
			
		||||
 | 
			
		||||
See the `View` toolbar menu to enable debug console widgets for open scenes or reopen previously closed panels.
 | 
			
		||||
 | 
			
		||||
Key features that are planned:
 | 
			
		||||
 | 
			
		||||
- [x] Runtime loading of `.obj` or similar 3D models.
 | 
			
		||||
- [x] Drag-and-drop interaction for adding objects to the scene.
 | 
			
		||||
- [x] Shader / object properties panel to modify related settings.
 | 
			
		||||
- [ ] Runtime reloading of modified GLSL shaders attached to objects within scenes.
 | 
			
		||||
- [ ] Multiple views of a scene at one time.
 | 
			
		||||
- [ ] Camera control modes such as panning, orbiting, or following objects.
 | 
			
		||||
- [ ] Save / load for scene data. The current inheritance model is temporary.
 | 
			
		||||
- [ ] Save / load scene data. The current model requires writing C++ code.
 | 
			
		||||
- [ ] 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.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Spartan with no normals -
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Spartan with normals -
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
Object names can be double-clicked in the tree view panel for quick camera
 | 
			
		||||
navigation. All side panels and toolbars are dockable widgets that can be popped out
 | 
			
		||||
and reorganized as needed. Panels can also 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.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
For examples of using the Qtk API, see the `example-app` project in the root of
 | 
			
		||||
this repository.
 | 
			
		||||
 | 
			
		||||
@ -211,6 +226,11 @@ Ubuntu clang-format version 18.1.3 (1ubuntu1)
 | 
			
		||||
CLion has integration for IDE code reformatting actions with `clang-format`.
 | 
			
		||||
If you're using CLion, the `.clang-format` configuration will be picked up by CLion automatically.
 | 
			
		||||
 | 
			
		||||
This repository provides the [`tools/format.sh`](./tools/format.sh) helper script to run `clang-tidy` and `clang-format` on Ubuntu 24.04.
 | 
			
		||||
Running the script will build Qtk, so it's important to ensure you can manually build from source first.
 | 
			
		||||
 | 
			
		||||
If you'd still like to run these tools manually, see the instructions below.
 | 
			
		||||
 | 
			
		||||
`clang-tidy` can be run with the following commands.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
@ -288,7 +308,7 @@ To generate packages for Qtk desktop application, we should
 | 
			
		||||
set `-DQTK_GUI=ON`. If this option is not set we will only package libqtk.
 | 
			
		||||
 | 
			
		||||
The NSIS installer will allow component-specific path modification for all of
 | 
			
		||||
these installation components through a GUI install application.
 | 
			
		||||
these installation components through a Windows GUI install application.
 | 
			
		||||
 | 
			
		||||
##### Resources
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 398 B  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-256.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 755 B  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-48.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/linux/kilroy-64.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										11
									
								
								resources/icons/linux/linux-icons.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# $1: Input path to an image to use for generating icons.
 | 
			
		||||
# Helper script to generate qtk's icons for Linux given a path to an input PNG.
 | 
			
		||||
sudo apt install imagemagick
 | 
			
		||||
 | 
			
		||||
convert "$1" -resize 256x256 kilroy-256.png
 | 
			
		||||
convert "$1" -resize 128x128 kilroy-128.png
 | 
			
		||||
convert "$1" -resize 64x64 kilroy-64.png
 | 
			
		||||
convert "$1" -resize 48x48 kilroy-48.png
 | 
			
		||||
convert "$1" -resize 32x32 kilroy-32.png
 | 
			
		||||
convert "$1" -resize 16x16 kilroy-16.png
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
sudo apt install icnsutils
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
convert icon.png -resize 32x32 kilroy_32.png
 | 
			
		||||
convert icon.png -resize 16x16 kilroy_16.png
 | 
			
		||||
convert icon.png -resize 48x48 kilroy_48.png
 | 
			
		||||
convert icon.png -resize 128x128 kilroy_128.png
 | 
			
		||||
convert icon.png -resize 256x256 kilroy_256.png
 | 
			
		||||
png2icns png2icns kilroy.icns kilroy_*.png
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								resources/icons/osx/kilroy_splash.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 66 KiB  | 
							
								
								
									
										15
									
								
								resources/icons/osx/osx-icons.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@ -0,0 +1,15 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# $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.
 | 
			
		||||
sudo apt install icnsutils imagemagick
 | 
			
		||||
 | 
			
		||||
convert "$1" -resize 32x32 kilroy_32.png
 | 
			
		||||
convert "$1" -resize 16x16 kilroy_16.png
 | 
			
		||||
convert "$1" -resize 48x48 kilroy_48.png
 | 
			
		||||
convert "$1" -resize 128x128 kilroy_128.png
 | 
			
		||||
convert "$1" -resize 256x256 kilroy_256.png
 | 
			
		||||
# For the application bundle in OSX.
 | 
			
		||||
png2icns png2icns kilroy.icns kilroy_*.png
 | 
			
		||||
 | 
			
		||||
# For the splash image in DMG installers.
 | 
			
		||||
convert "$1" -resize 800x600! kilroy_splash.png
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								resources/icons/win/kilroy.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/icons/win/kilroy_splash.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 201 KiB  | 
							
								
								
									
										10
									
								
								resources/icons/win/win-icons.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@ -0,0 +1,10 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# $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.
 | 
			
		||||
sudo apt install imagemagick
 | 
			
		||||
 | 
			
		||||
# For the NSIS (un)installer executable shortcut icon.
 | 
			
		||||
convert "$1" -resize 256x256,128x128,64x64,48x48,32x32,16x16 -background transparent -colors 256 kilroy.ico
 | 
			
		||||
 | 
			
		||||
# For the NSIS installer splash screen.
 | 
			
		||||
convert "$1" -resize 164x314! -background white -flatten kilroy_splash.bmp
 | 
			
		||||
							
								
								
									
										6
									
								
								resources/qtk.desktop
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Qtk
 | 
			
		||||
Exec=/usr/bin/qtk_gui
 | 
			
		||||
Icon=qtk
 | 
			
		||||
Type=Application
 | 
			
		||||
Categories=Utility;
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
        <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>icon.png</file>
 | 
			
		||||
        <file alias="icon.png">icons/icon.png</file>
 | 
			
		||||
    </qresource>
 | 
			
		||||
    <qresource prefix="/shaders">
 | 
			
		||||
        <file alias="model.frag">shaders/fragment/model.frag</file>
 | 
			
		||||
@ -46,8 +46,8 @@
 | 
			
		||||
        <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-specular.frag">shaders/fragment/model-specular.frag</file>
 | 
			
		||||
        <file alias="model-specular.vert">shaders/vertex/model-specular.vert</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-normals.frag">shaders/fragment/model-normals.frag</file>
 | 
			
		||||
        <file alias="model-normals.vert">shaders/vertex/model-normals.vert</file>
 | 
			
		||||
        <file alias="skybox.frag">skybox/skybox.frag</file>
 | 
			
		||||
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 316 KiB  | 
| 
		 Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB  | 
| 
		 Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB  | 
| 
		 Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 263 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 428 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-ambient.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 205 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-diffuse.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 188 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-phong.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 264 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-specular.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 176 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen-texture.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 288 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/screen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 437 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/spartan-normals.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 359 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/screenshots/spartan-phong.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 349 KiB  | 
| 
		 Before Width: | Height: | Size: 660 KiB  | 
| 
		 Before Width: | Height: | Size: 646 KiB  | 
@ -103,18 +103,82 @@ configure_package_config_file(
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
 | 
			
		||||
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
 | 
			
		||||
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
 | 
			
		||||
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")
 | 
			
		||||
if (QTK_GUI)
 | 
			
		||||
  set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Qt OpenGL 3D graphics renderer.")
 | 
			
		||||
else()
 | 
			
		||||
  set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Qt OpenGL 3D graphics library.")
 | 
			
		||||
endif()
 | 
			
		||||
set(CPACK_PACKAGE_HOMEPAGE_URL "https://git.shaunreed.com/shaunrd0/qtk")
 | 
			
		||||
set(CPACK_SOURCE_IGNORE_FILES build*;install;\.git;\.github;\.idea)
 | 
			
		||||
set(CPACK_PACKAGE_DIRECTORY packages/)
 | 
			
		||||
set(CPACK_PACKAGE_CONTACT "shaunreed.com")
 | 
			
		||||
#set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icon.png")
 | 
			
		||||
set(CPACK_THREADS 0)
 | 
			
		||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Qtk")
 | 
			
		||||
 | 
			
		||||
if (WIN32)
 | 
			
		||||
  # Windows
 | 
			
		||||
  # Set icon for the splash image used in Windows NSIS installers.
 | 
			
		||||
  set(CPACK_PACKAGE_ICON "${QTK_RESOURCES}/icons/win/kilroy_splash.bmp")
 | 
			
		||||
  set(CPACK_NSIS_MODIFY_PATH ON)
 | 
			
		||||
  set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
 | 
			
		||||
  # https://nsis.sourceforge.io/Reference/CreateShortCut
 | 
			
		||||
  set(
 | 
			
		||||
      CPACK_NSIS_CREATE_ICONS_EXTRA
 | 
			
		||||
      "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_gui.exe'"
 | 
			
		||||
  )
 | 
			
		||||
  set(
 | 
			
		||||
      CPACK_NSIS_DELETE_ICONS_EXTRA
 | 
			
		||||
      "Delete '$SMPROGRAMS\\\\$START_MENU\\\\Qtk.lnk'"
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  # Set icon for the installer executable.
 | 
			
		||||
  set(CPACK_NSIS_MUI_ICON "${QTK_RESOURCES}/icons/win/kilroy.ico")
 | 
			
		||||
  # Set icon for uninstaller executable.
 | 
			
		||||
  set(CPACK_NSIS_MUI_UNIICON "${QTK_RESOURCES}/icons/win/kilroy.ico")
 | 
			
		||||
elseif(APPLE)
 | 
			
		||||
  # OSX
 | 
			
		||||
  # Set icon for the splash image used in OSX DMG installers.
 | 
			
		||||
  set(CPACK_PACKAGE_ICON "${QTK_RESOURCES}/icons/osx/kilroy_splash.bmp")
 | 
			
		||||
 | 
			
		||||
  # Set additional options for the OSX bundle.
 | 
			
		||||
  set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
 | 
			
		||||
  set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_gui>/Info.plist)
 | 
			
		||||
  set(CPACK_BUNDLE_ICON ${QTK_OSX_ICONS})
 | 
			
		||||
else(UNIX)
 | 
			
		||||
  # Linux
 | 
			
		||||
  # Install icons for qtk.
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-16.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/16x16/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-32.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/32x32/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-48.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/48x48/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-64.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/64x64/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-128.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/128x128/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/icons/linux/kilroy-256.png
 | 
			
		||||
      DESTINATION /usr/share/icons/hicolor/256x256/apps
 | 
			
		||||
      RENAME qtk.png)
 | 
			
		||||
 | 
			
		||||
  # Install the desktop file for qtk.
 | 
			
		||||
  install(FILES ${QTK_RESOURCES}/qtk.desktop
 | 
			
		||||
      DESTINATION /usr/share/applications)
 | 
			
		||||
 | 
			
		||||
  # Set additional options for the debian APT package.
 | 
			
		||||
  set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE_URL})
 | 
			
		||||
  set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Remove any assimp components if defined by submodule.
 | 
			
		||||
if (QTK_SUBMODULES)
 | 
			
		||||
  get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS)
 | 
			
		||||
@ -122,31 +186,6 @@ if (QTK_SUBMODULES)
 | 
			
		||||
  list(REMOVE_ITEM CPACK_COMPONENTS_ALL Unspecified)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Windows
 | 
			
		||||
set(CPACK_NSIS_MODIFY_PATH ON)
 | 
			
		||||
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
 | 
			
		||||
# https://nsis.sourceforge.io/Reference/CreateShortCut
 | 
			
		||||
set(
 | 
			
		||||
    CPACK_NSIS_CREATE_ICONS_EXTRA
 | 
			
		||||
    "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Qtk.lnk' '$INSTDIR\\\\bin\\\\qtk_gui.exe'"
 | 
			
		||||
)
 | 
			
		||||
set(
 | 
			
		||||
    CPACK_NSIS_DELETE_ICONS_EXTRA
 | 
			
		||||
    "Delete '$SMPROGRAMS\\\\$START_MENU\\\\Qtk.lnk'"
 | 
			
		||||
)
 | 
			
		||||
# TODO: Icons for NSIS installer.
 | 
			
		||||
#set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/resources/icon.png")
 | 
			
		||||
#set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/resources/icon.png")
 | 
			
		||||
 | 
			
		||||
# Debian
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE_URL})
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
 | 
			
		||||
 | 
			
		||||
# OSX
 | 
			
		||||
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
 | 
			
		||||
set(CPACK_BUNDLE_PLIST $<TARGET_BUNDLE_CONTENT_DIR:qtk_gui>/Info.plist)
 | 
			
		||||
set(CPACK_BUNDLE_ICON ${QTK_OSX_ICONS})
 | 
			
		||||
 | 
			
		||||
# Platform defaults for source bundles.
 | 
			
		||||
if(WIN32)
 | 
			
		||||
  set(CPACK_SOURCE_GENERATOR ZIP)
 | 
			
		||||
 | 
			
		||||
@ -57,15 +57,18 @@ set(
 | 
			
		||||
qt_add_executable(qtk_gui ${QTK_GUI_SOURCES})
 | 
			
		||||
target_link_libraries(qtk_gui PRIVATE qtk_plugin_library)
 | 
			
		||||
 | 
			
		||||
set_target_properties(
 | 
			
		||||
    qtk_gui PROPERTIES
 | 
			
		||||
      WIN32_EXECUTABLE TRUE
 | 
			
		||||
if (WIN32)
 | 
			
		||||
  set_target_properties(qtk_gui PROPERTIES WIN32_EXECUTABLE TRUE)
 | 
			
		||||
elseif(APPLE)
 | 
			
		||||
  set_target_properties(
 | 
			
		||||
      qtk_gui PROPERTIES
 | 
			
		||||
      MACOSX_BUNDLE TRUE
 | 
			
		||||
      MACOSX_BUNDLE_BUNDLE_NAME Qtk
 | 
			
		||||
      MACOSX_BUNDLE_ICON_FILE ${QTK_OSX_ICONS}
 | 
			
		||||
      MACOSX_BUNDLE_GUI_IDENTIFIER ${CMAKE_PROJECT_NAME}
 | 
			
		||||
      MACOSX_BUNDLE_INFO_STRING ${CMAKE_PROJECT_DESCRIPTION}
 | 
			
		||||
      MACOSX_BUNDLE_COPYRIGHT "All Content (c) 2023 Shaun Reed, all rights reserved"
 | 
			
		||||
      MACOSX_BUNDLE_COPYRIGHT ${QTK_COPYRIGHT}
 | 
			
		||||
      MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
 | 
			
		||||
      MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
 | 
			
		||||
)
 | 
			
		||||
  )
 | 
			
		||||
endif()
 | 
			
		||||
@ -33,12 +33,14 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
 | 
			
		||||
 | 
			
		||||
    // Add GUI 'view' toolbar option to show debug console.
 | 
			
		||||
    ui_->menuView->addAction(qtkWidget->getActionToggleConsole());
 | 
			
		||||
 | 
			
		||||
    // Refresh GUI widgets when scene or objects are updated.
 | 
			
		||||
    connect(qtkWidget->getScene(),
 | 
			
		||||
            &Qtk::Scene::sceneUpdated,
 | 
			
		||||
            this,
 | 
			
		||||
            &MainWindow::refreshScene);
 | 
			
		||||
    connect(qtkWidget, &Qtk::QtkWidget::objectFocusChanged,
 | 
			
		||||
    connect(qtkWidget,
 | 
			
		||||
            &Qtk::QtkWidget::objectFocusChanged,
 | 
			
		||||
            ui_->qtk__ToolBox,
 | 
			
		||||
            &Qtk::ToolBox::updateFocus);
 | 
			
		||||
  }
 | 
			
		||||
@ -71,8 +73,8 @@ MainWindow::~MainWindow()
 | 
			
		||||
 | 
			
		||||
MainWindow * MainWindow::getMainWindow()
 | 
			
		||||
{
 | 
			
		||||
  static MainWindow window;
 | 
			
		||||
  return &window;
 | 
			
		||||
  static auto * window = new MainWindow;
 | 
			
		||||
  return window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Qtk::QtkWidget * MainWindow::getQtkWidget(int64_t index)
 | 
			
		||||
 | 
			
		||||
@ -48,10 +48,9 @@ namespace Ui
 | 
			
		||||
 * Any application using a QtkWidget can set a custom scene in their main
 | 
			
		||||
 * function. See the MainWindow::MainWindow constructor as an example.
 | 
			
		||||
 */
 | 
			
		||||
class EmptyScene : public Qtk::Scene {
 | 
			
		||||
  void init() override {
 | 
			
		||||
    setSceneName("Empty Scene");
 | 
			
		||||
  }
 | 
			
		||||
class EmptyScene : public Qtk::Scene
 | 
			
		||||
{
 | 
			
		||||
    void init() override { setSceneName("Empty Scene"); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowIcon">
 | 
			
		||||
   <iconset>
 | 
			
		||||
    <normaloff>../resources/icon.png</normaloff>../resources/icon.png</iconset>
 | 
			
		||||
    <normaloff>../resources/icons/icon.png</normaloff>../resources/icons/icon.png</iconset>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="unifiedTitleAndToolBarOnMac">
 | 
			
		||||
   <bool>true</bool>
 | 
			
		||||
 | 
			
		||||
@ -260,8 +260,8 @@ void QtkScene::init()
 | 
			
		||||
  /* Test spartan Model with phong lighting, specular and normal mapping. */
 | 
			
		||||
  model = addObject(new Qtk::Model("spartanTest",
 | 
			
		||||
                                   ":/models/models/spartan/spartan.obj",
 | 
			
		||||
                                   ":/shaders/model-normals.vert",
 | 
			
		||||
                                   ":/shaders/model-normals.frag"));
 | 
			
		||||
                                   ":/shaders/model-phong.vert",
 | 
			
		||||
                                   ":/shaders/model-phong.frag"));
 | 
			
		||||
  model->getTransform().setTranslation(0.0f, -1.0f, 10.0f);
 | 
			
		||||
  model->getTransform().scale(2.0f);
 | 
			
		||||
  model->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f));
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,11 @@ void QtkWidget::initializeGL()
 | 
			
		||||
  // Connect the frameSwapped signal to call the update() function
 | 
			
		||||
  connect(this, SIGNAL(frameSwapped()), this, SLOT(update()));
 | 
			
		||||
 | 
			
		||||
  toggleConsole();
 | 
			
		||||
  // Add the debug console widget to the window and set its hidden state.
 | 
			
		||||
  MainWindow::getMainWindow()->addDockWidget(
 | 
			
		||||
      Qt::DockWidgetArea::BottomDockWidgetArea, mConsole);
 | 
			
		||||
  mConsole->setHidden(!mConsoleActive);
 | 
			
		||||
 | 
			
		||||
  // Initialize OpenGL debug context
 | 
			
		||||
  mDebugLogger = new QOpenGLDebugLogger(this);
 | 
			
		||||
  if (mDebugLogger->initialize()) {
 | 
			
		||||
@ -144,15 +148,8 @@ void QtkWidget::setScene(Scene * scene)
 | 
			
		||||
 | 
			
		||||
void QtkWidget::toggleConsole()
 | 
			
		||||
{
 | 
			
		||||
  if (mConsoleActive) {
 | 
			
		||||
    mConsole->setHidden(true);
 | 
			
		||||
    mConsoleActive = false;
 | 
			
		||||
  } else {
 | 
			
		||||
    MainWindow::getMainWindow()->addDockWidget(
 | 
			
		||||
        Qt::DockWidgetArea::BottomDockWidgetArea, mConsole);
 | 
			
		||||
    mConsole->setHidden(false);
 | 
			
		||||
    mConsoleActive = true;
 | 
			
		||||
  }
 | 
			
		||||
  mConsole->setHidden(mConsoleActive);
 | 
			
		||||
  mConsoleActive = !mConsoleActive;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
 | 
			
		||||
@ -210,7 +210,7 @@ namespace Qtk
 | 
			
		||||
      QOpenGLDebugLogger * mDebugLogger;
 | 
			
		||||
      Qtk::Scene * mScene;
 | 
			
		||||
      Qtk::DebugConsole * mConsole;
 | 
			
		||||
      bool mConsoleActive = false;
 | 
			
		||||
      bool mConsoleActive = true;
 | 
			
		||||
  };
 | 
			
		||||
}  // namespace Qtk
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -41,36 +41,33 @@ void Qtk::TreeView::updateView(const Qtk::Scene * scene)
 | 
			
		||||
  mSceneName = scene->getSceneName();
 | 
			
		||||
  auto objects = scene->getObjects();
 | 
			
		||||
  for (const auto & object : objects) {
 | 
			
		||||
    auto item =
 | 
			
		||||
        new QTreeWidgetItem(QStringList(QString(object->getName().c_str())));
 | 
			
		||||
    ui->treeWidget->insertTopLevelItem(0, item);
 | 
			
		||||
    QStringList list(QStringList(QString(object->getName().c_str())));
 | 
			
		||||
    ui->treeWidget->insertTopLevelItem(0, new QTreeWidgetItem(list));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Qtk::TreeView::itemFocus(QTreeWidgetItem * item, int column)
 | 
			
		||||
{
 | 
			
		||||
  QString name = item->text(column);
 | 
			
		||||
  const QString & name = item->text(column);
 | 
			
		||||
  auto scene = MainWindow::getMainWindow()->getQtkWidget()->getScene();
 | 
			
		||||
  auto & transform = Qtk::Scene::getCamera().getTransform();
 | 
			
		||||
  auto object = scene->getObject(name);
 | 
			
		||||
  Transform3D * objectTransform;
 | 
			
		||||
  // If the object is a mesh or model, focus the camera on it.
 | 
			
		||||
  if (object == Q_NULLPTR) {
 | 
			
		||||
    qDebug() << "Attempt to get non-existing object with name '" << name
 | 
			
		||||
             << "'\n";
 | 
			
		||||
  } else if (object->getType() == Object::QTK_MESH) {
 | 
			
		||||
    objectTransform = &dynamic_cast<MeshRenderer *>(object)->getTransform();
 | 
			
		||||
  } else if (object->getType() == Object::QTK_MODEL) {
 | 
			
		||||
    objectTransform = &dynamic_cast<Model *>(object)->getTransform();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  auto focusScale = objectTransform->getScale();
 | 
			
		||||
  const Transform3D & objectTransform = object->getTransform();
 | 
			
		||||
 | 
			
		||||
  auto & camera_transform = Qtk::Scene::getCamera().getTransform();
 | 
			
		||||
  auto focusScale = objectTransform.getScale();
 | 
			
		||||
  float width = focusScale.x() / 2.0f;
 | 
			
		||||
  float height = focusScale.y() / 2.0f;
 | 
			
		||||
  QVector3D pos = objectTransform->getTranslation();
 | 
			
		||||
  QVector3D pos = objectTransform.getTranslation();
 | 
			
		||||
  // pos.setX(pos.x() + width);
 | 
			
		||||
  pos.setY(pos.y() + height);
 | 
			
		||||
  transform.setTranslation(pos);
 | 
			
		||||
  transform.translate(0.0f, 0.0f, 3.0f);
 | 
			
		||||
  camera_transform.setTranslation(pos);
 | 
			
		||||
  camera_transform.translate(0.0f, 0.0f, 3.0f);
 | 
			
		||||
 | 
			
		||||
  // Emit signal from qtk widget for new object focus. Triggers GUI updates.
 | 
			
		||||
  emit MainWindow::getMainWindow() -> getQtkWidget()->objectFocusChanged(name);
 | 
			
		||||
 | 
			
		||||
@ -216,7 +216,7 @@ namespace Qtk
 | 
			
		||||
      /**
 | 
			
		||||
       * @return Transform3D attached to this MeshRenderer.
 | 
			
		||||
       */
 | 
			
		||||
      inline Transform3D & getTransform() { return mTransform; }
 | 
			
		||||
      inline Transform3D & getTransform() override { return mTransform; }
 | 
			
		||||
 | 
			
		||||
      [[nodiscard]] inline std::string getVertexShader() const override
 | 
			
		||||
      {
 | 
			
		||||
 | 
			
		||||
@ -129,7 +129,7 @@ namespace Qtk
 | 
			
		||||
      /**
 | 
			
		||||
       * @return Transform3D attached to this Model.
 | 
			
		||||
       */
 | 
			
		||||
      inline Transform3D & getTransform() { return mTransform; }
 | 
			
		||||
      inline Transform3D & getTransform() override { return mTransform; }
 | 
			
		||||
 | 
			
		||||
      [[nodiscard]] inline std::string getVertexShader() const override
 | 
			
		||||
      {
 | 
			
		||||
 | 
			
		||||
@ -111,6 +111,11 @@ namespace Qtk
 | 
			
		||||
        return mTransform;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      [[nodiscard]] inline virtual Transform3D & getTransform()
 | 
			
		||||
      {
 | 
			
		||||
        return mTransform;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      [[nodiscard]] inline virtual std::string getVertexShader() const
 | 
			
		||||
      {
 | 
			
		||||
        return "Base Object has no vertex shader.";
 | 
			
		||||
 | 
			
		||||
@ -118,11 +118,9 @@ void Scene::setSkybox(Skybox * skybox)
 | 
			
		||||
 | 
			
		||||
void Scene::initSceneObjectName(Object * object)
 | 
			
		||||
{
 | 
			
		||||
  if (!mObjectCount.count(object->getName())) {
 | 
			
		||||
    mObjectCount[object->getName()] = 1;
 | 
			
		||||
  } else {
 | 
			
		||||
    mObjectCount[object->getName()]++;
 | 
			
		||||
  }
 | 
			
		||||
  mObjectCount[object->getName()] = mObjectCount.count(object->getName()) + 1;
 | 
			
		||||
 | 
			
		||||
  // If the object exists make it's name unique.
 | 
			
		||||
  auto count = mObjectCount[object->getName()];
 | 
			
		||||
  if (count > 1) {
 | 
			
		||||
    object->setName(object->getName() + " (" + std::to_string(count) + ")");
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,15 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Helper script to run clang-tidy and clang-format.
 | 
			
		||||
# This should be executed from the root of the repository:
 | 
			
		||||
#
 | 
			
		||||
# git clone https://git.shaunreed.com/shaunrd0/qtk
 | 
			
		||||
# cd qtk
 | 
			
		||||
# ./tools/format.sh
 | 
			
		||||
 | 
			
		||||
# Configure and build qtk
 | 
			
		||||
cmake -B build && cmake --build build -- -j $(nproc --ignore=1)
 | 
			
		||||
clang-tidy -p build/ --fix --config-file=.clang-tidy \
 | 
			
		||||
  src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
 | 
			
		||||
clang-format -i --style=file:.clang-format \
 | 
			
		||||
  src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
 | 
			
		||||
 | 
			
		||||
# Run clang-tidy and clang-format
 | 
			
		||||
SOURCES="src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h"
 | 
			
		||||
clang-tidy -p build/ --fix --config-file=.clang-tidy $SOURCES
 | 
			
		||||
clang-format -i --style=file:.clang-format $SOURCES
 | 
			
		||||
 | 
			
		||||