Skip to content

A simple OpenGL based graphics engine for experimentation

License

Notifications You must be signed in to change notification settings

stuarthayhurst/ammonite-engine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,852 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ammonite

Ammonite Engine

  • A simple OpenGL based graphics engine, built to learn C++ and graphics programming
    • This isn't a serious, production-quality engine, please don't treat it as one
  • Despite the project being for learning, any contributions are still welcome
    • See docs/CONTRIBUTING.md to get started
    • If you found this project interesting, any donations are greatly appreciated :)

Features:

  • Multi-threaded model loading, using libassimp and a thread pool
  • Shader program caching with a custom hash
  • Key binding and mouse input support
  • Camera path support
  • Command prompt for engine control
  • Miscellaneous utilities (thread pool, thread-safe logging, timers, random number generation)

Requirements:

  • A c++23 compatible compiler (g++ (14+) / clang++ (18+))
    • Toolchain support for thread-local variables
    • All build and runtime dependencies installed
  • A 64-bit Linux system
    • Some functions may have AVX-512 / VAES accelerated versions
  • An OpenGL 4.5+ compatible driver
  • Alternatively, an OpenGL 3.2+ driver supporting the following extensions can be used
    • ARB_direct_state_access
    • ARB_shader_storage_buffer_object
    • ARB_texture_storage
    • ARB_texture_cube_map_array
  • OpenGL debugging is supported with KHR_debug
  • Program caching is supported with ARB_get_program_binary
  • No error contexts are supported with KHR_no_error

Building + installing libammonite:

  • make library
  • sudo make install

Running a demo:

  • make build will compile the library and all demos on the current branch
  • Demos can be listed with ./launch.sh --demo
  • Run a specific demo with ./launch.sh --demo [DEMO]
    • For example: ./launch.sh --demo object-field
    • Running the binary directly will only work if libammonite is installed to the system
  • make clean will clean the build area, to start from fresh
  • Screenshots of some demos can be found at the end of the README
  • The sponza demo requires some Intel assets
    • Download the Sponza base scene, then extract it to assets-experimental/intel-assets/main_sponza/
    • The Curtains and Ivy packages are also supported
      • Extract these to assets-experimental/intel-assets/pkg_a_curtains/ and assets-experimental/intel-assets/pkg_b_ivy/
  • All demos support the following keybinds:
    • W, A, S and D for movement
    • Left control to 'sprint'
    • Scroll to adjust zoom
    • Middle-click to reset zoom
    • B to switch camera
    • G to record a camera path
    • C to release input
    • ESC to close the demo
    • V to open the command prompt
    • F11 to toggle fullscreen
    • Up or down arrow to adjust the framerate limit
    • Z to toggle focal depth
    • [ or ] to adjust focal depth
  • The object-field demo additionally supports the following keybinds:
    • F to place a new cube at the camera's position
    • P to toggle model placement mode
      • Left-click to confirm placement
      • Scroll to adjust distance
      • Middle-click to reset distance
    • R to shuffle placed objects

Options:

  • Compiled demos have a few arguments supported:
    • --help: Displays a help menu
    • --benchmark: Start a benchmark
    • --demo: List available demos
    • --demo [DEMO]: Launch a specific demo
    • --vsync: Enable / disable VSync (true / false)

Build system:

  • Targets:

    • build and library support -j[CORE COUNT]
    • make build - Builds the demo
    • make library - Builds build/libammonite.so
    • make install - Installs libammonite.so to the system
    • make headers - Installs Ammonite headers and ammonite.pc to the system
    • make uninstall - Removes installed library and headers
      • Custom install locations must be specified the same way as they were installed
    • make clean - Cleans the build area (build/) and default runtime cache (cache/)
  • All targets and optional flags are documented here
  • Set the environment variable PREFIX_DIR to configure the base install path
    • The install, headers and uninstall targets have additional path options

Dependencies:

  • Package names are correct for Debian, other distros may vary
  • make
  • pkgconf
  • coreutils
  • sed
  • python3
  • g++ OR clang++
    • If using clang++, use CXX="clang++" make [TARGET]
      • USE_LLVM_CPP=true might be useful for systems without (a new enough) GCC
    • When swapping between different compilers, run make clean
  • Libraries:

    • libglm-dev libglfw3-dev libepoxy-dev libstb-dev libassimp-dev
    • libdecor-0-0 libdecor-0-plugin-1-gtk are required for Wayland window decorations
  • Linting:

    • clang-tidy (21+)
  • Icons:

    • inkscape optipng

Issues:

  • Due to the small size of this project, only a small range of hardware can be tested
    • If you hardware / driver meets the requirements listed here, but the engine doesn't work, please file a bug report
  • Issues, feature requests and bug reports can be filed here
  • Feel free to work on any issues / feature ideas, suggestions are welcome :)

Usage:

  • Some very basic usage information can be found in docs/USAGE.md
  • Better documentation is planned in the future

Screenshots:

Demo 1

Demo 2

Credits:

  • Some models in assets/ may have been created by third parties, attribution can be found in docs/CREDITS.md
  • Reference materials:

Licence:

  • This project is available under the terms of the MIT License
    • These terms can be found in LICENCE.txt

About

A simple OpenGL based graphics engine for experimentation

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks