Home

Awesome

<img width="100%" src="resources/readme/title.png" />

Project Island 🌋🐎

Project Island is an experimental Vulkan Renderer for Linux and Windows, written in C/C++.

Island is written for rapid protoyping and tweaking. That's why it allows hot-reloading wherever possible: for C/C++ application code, GLSL or HLSL shader code, even the renderer's own core modules.

Island is fast to compile. A full rebuild should take < 5s on a moderate multicore machine, and incremental builds often take < 1s.

To achieve this aim, Island is structured into strictly separated modules, which can be dropped in or out during Debug, while for Release, you can build a single, statically linked and optimised binary.

C/C++ CI

Main Features:

<img width="350" src="https://github.com/tgfrerer/island/assets/423509/b97ef461-42b1-4fbd-b3a0-c4051bb6e8d7" align="right" />

Examples (more examples)

Island comes with a number of examples. No collection of examples would be complete without a

Hello Triangleand a Hello World example
<img width="350" src="apps/examples/hello_triangle/screenshot.png" /><img width="350" align="right" src="apps/examples/hello_world/screenshot.jpg" />

[!TIP]

A full list of examples can be found here. Examples can be used as starting point for new projects by using the project generator.

Tools

Project Generator

Island projects can be scaffolded from templates (or from other, existing projects) by invoking the project generator python script. This script lives in the scripts folder, but can be invoked from anywhere.

# say myapps is where I want to place a new island project
cd island/apps/myapps

# this will create a new project based on the "hello triangle" template
../../scripts/create_project.py mynewproject

# this will create a new project based on the "full screen quad" template
../../scripts/create_project.py mynewquadproject -t quad_template

# this will create a new project based on the project "myoldproject", if it can be found in the current directory
../../scripts/create_project.py anotherproject -T . -t myoldproject
# print options and help for project generator via 
../../scripts/create_project.py -h
usage: create_project.py [-h] [-T TEMPLATE_DIR] [-t TEMPLATE_NAME]
                         project_name

Create a new Island project based on a template / or an existing
project.

positional arguments:
  project_name          Specify the name for new project to create
                        from template.

options:
  -h, --help            show this help message and exit
  -T TEMPLATE_DIR, --template-dir TEMPLATE_DIR
                        Specify a path *relative to the current
                        directory* in which to look for project
                        template directories. Use dot (".") to search
                        for project directories within the current
                        directory - for example if you wish to
                        duplicate an existing project as a starting
                        point for a new project.
  -t TEMPLATE_NAME, --template-name TEMPLATE_NAME
                        Specify the name for template. This can be
                        the name of any project directory within
                        TEMPLATE_DIR.

Modules

Island projects can be built by combining any number of island modules. Each module aims to do one thing well, and to play nice with others. Modules are automatically hot-reloaded, if a change is detected and hot-reloading is active. Some modules provide their functionality by wrapping well-known external libraries, some are written entirely from scratch. Some of the most useful modules are listed here:

ModuleWrapsDescription
le_camera-interactive, mouse controlled camera
le_path-draw svg-style paths, parse simplified SVG-style path command lists
le_imguiimguigraphical user interface
le_pixelsstb imageload image files
le_pnglodepngimage codec: load and store png files, supports fpnge on linux
le_exropenEXRimage codec: load and store exr files, support for f16 f32 images
le_fontstb truetypetruetype glyph sdf, geometry and texture atlas based typesetting
le_pipeline_builder-build graphics, and compute pipelines
le_rtx_pipeline_builder-build Khronos RTX raytracing pipelines
le_2d-simplified 2d drawing context
le_timebase-timekeeping, canonical clock for animations
le_jobs-fiber-based job system
le_ecs-entity-component-system
le_shader_compilershaderccompile GLSL, and HLSL shader source to SPIR-V
le_windowglfwwindow i/o system
le_swapchain-windowed, direct, or straight-to-video output
le_renderer-record command buffers, evaluate rendergraphs
le_video_decoder-hardware accelerated video decoding using Vulkan Video API
le_backend-interact with GPU via Vulkan, manage GPU resources
le_screenshot-save renderpass images to disk, supports image sequences, and any file format for which there is an image encoder, notably exr, png

[!TIP]

To use a module, name it as a dependency in your applidation module's CMakeLists.txt file; modules may depend on other modules, and the build system will automatically include these dependencies. You can write your own modules - and there is a module template generator which provides you with a scaffold to start from.

Setup instructions

Island should run out of the box on a modern Linux system with the current Vulkan SDK and build tools installed. For Windows, build instructions are collected in a separate readme.

Dependencies

Island depends on a few common development tools: CMake, gcc, git, ninja. These are commonly found on a development machine. Island also depends on the Vulkan SDK.

Install Vulkan SDK

Vulkan SDK >= 1.3.211

I recommend to install the latest Vulkan SDK via a package manager. Follow the installation instructions via: https://vulkan.lunarg.com/sdk/home#linux.

Arch Linux (Manjaro)

On Arch Linux, I recommend installing the following packages via pacman: shaderc vulkan-devel ninja cmake.

Building an Island project

[!IMPORTANT]

If you freshly cloned the Island repository, remember to update submodules before proceeding.

git submodule init
git submodule update --depth=1

Then move to the directory of the Island project which you want to compile:

cd apps/examples/hello_triangle/

Build using CMake:

mkdir build
cd build
cmake -G Ninja ..
ninja

Run your new Island Application:

./Island-HelloTriangle

[!NOTE]

The CMAKE parameter PLUGINS_DYNAMIC lets you choose whether to compile Island as a static binary, or as a thin module with dynamic plugins. Unless you change this parameter, Debug builds will be built thin/dynamic with hot-reloading enabled, and Release builds will produce a single static binary with hot-reloading disabled.

IDE support

I recommend using the freely available QT Creator IDE, it allows you to directly open CMake project files, and integrates pretty seamlessly with the Island workflow: running, hot-reloading, then setting a breakpoint, and then stepping whilst inspecting state in the debugger just works. Alternative IDEs are of course available, and as long as they support CMake project files, should work. When running an Island app with the debugger in Qt Creator, it's important to check that Run in terminal is disabled - this can be specified in the Run Settings dialog.

Auto-recompilation on save using entr

If you prefer to work without an IDE, but wish a setup where apps get recompiled as soon as a source file changes, the following Linux-based setup is pretty nice:

    cd apps/examples/hello_triangle
    mkdir build
    cd build
    cmake -G Ninja ..
    # and then 
    git ls-files ../.. | entr ninja &

entr(1) is a great utility, which runs a command on file change. The last line of the above script causes ninja to run as soon as any of the files checked into the github repo at hello_triangle change.

Windows 11 support

Island can compile and run natively on Microsoft Windows - with some caveats. Progress of the Windows port and Windows-specific build instructions etc. are tracked in a separate readme.

Caveats

[!CAUTION]

Island's API is under active development, expect lots of change. As such, there are no promises that it might be ready or fit for any purpose, and the code here is released in the hope that you might find it interesting.

The initial motivation for writing Island was to experiment with a modern rendering API (Vulkan), to learn by trying out ideas around modern realtime-rendering, and to have a framework to create visual experiments with.