Skip to content
Snippets Groups Projects
Commit 8659041b authored by TheLavaBlock's avatar TheLavaBlock
Browse files

v0.4.2

parent 3a766688
Branches
No related tags found
No related merge requests found
version: '{build}'
branches:
only:
- master
skip_tags: true
image: Visual Studio 2019
platform: x64
configuration: Release
environment:
CFLAGS: /WX
matrix:
fast_finish: true
install:
- git submodule update --init
before_build:
- cmake -G "Visual Studio 16 2019" -A x64 .
build:
project: $(APPVEYOR_BUILD_FOLDER)\$(APPVEYOR_PROJECT_NAME).sln
parallel: true
verbosity: minimal
\ No newline at end of file
/build
[submodule "ext/argh"]
path = ext/argh
url = https://github.com/adishavit/argh.git
[submodule "ext/assimp"]
path = ext/assimp
url = https://github.com/assimp/assimp.git
[submodule "ext/better-enums"]
path = ext/better-enums
url = https://github.com/aantron/better-enums.git
[submodule "ext/bitmap"]
path = ext/bitmap
url = https://github.com/ArashPartow/bitmap.git
[submodule "ext/glfw"]
path = ext/glfw
url = https://github.com/glfw/glfw.git
[submodule "ext/gli"]
path = ext/gli
url = https://github.com/g-truc/gli.git
[submodule "ext/glm"]
path = ext/glm
url = https://github.com/g-truc/glm.git
[submodule "ext/json"]
path = ext/json
url = https://github.com/nlohmann/json.git
[submodule "ext/physfs"]
path = ext/physfs
url = https://github.com/criptych/physfs.git
[submodule "ext/selene"]
path = ext/selene
url = https://github.com/kmhofmann/selene.git
ignore = dirty
[submodule "ext/spdlog"]
path = ext/spdlog
url = https://github.com/gabime/spdlog.git
[submodule "ext/stb"]
path = ext/stb
url = https://github.com/nothings/stb.git
[submodule "ext/tinyfiledialogs"]
path = ext/tinyfiledialogs
url = https://github.com/native-toolkit/tinyfiledialogs.git
[submodule "ext/tinyobjloader"]
path = ext/tinyobjloader
url = https://github.com/syoyo/tinyobjloader.git
[submodule "ext/volk"]
path = ext/volk
url = https://github.com/zeux/volk.git
[submodule "ext/Vulkan-Headers"]
path = ext/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "ext/VulkanMemoryAllocator"]
path = ext/VulkanMemoryAllocator
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
language: cpp
compiler: gcc
sudo: false
dist: trusty
os:
- linux
git:
submodules: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-8
before_install:
- sudo apt-get update
- sudo apt-get install -y libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev
- git submodule update --init
install:
- DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
- mkdir ${DEPS_DIR} && cd ${DEPS_DIR}
- travis_retry wget --no-check-certificate https://github.com/Kitware/CMake/releases/download/v3.15.3/cmake-3.15.3-Linux-x86_64.tar.gz
- tar -xvf cmake-3.15.3-Linux-x86_64.tar.gz > /dev/null
- mv cmake-3.15.3-Linux-x86_64 cmake-install
- PATH=${DEPS_DIR}/cmake-install:${DEPS_DIR}/cmake-install/bin:$PATH
- cd ${TRAVIS_BUILD_DIR}
script:
- echo ${PATH}
- cmake --version
- export CC=gcc-8
- export CXX=g++-8
- echo ${CXX}
- ${CXX} --version
- ${CXX} -v
- mkdir -p build && cd build
- cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release .. && make -j4
\ No newline at end of file
# file : CMakeLists.txt
# copyright : Copyright (c) 2018-present, Lava Block OÜ
# license : MIT; see accompanying LICENSE file
cmake_minimum_required(VERSION 3.12)
project(liblava VERSION 0.4.2 LANGUAGES C CXX)
message("")
message("========================================================================")
message(" copyright (c) 2018-present, Lava Block OÜ MIT licensed ")
message("========================================================================")
message(" ")
message(" _| _| _| _| ")
message(" _| _|_|_| _| _|_|_| _| _| _|_|_| ")
message(" _| _| _| _| _| _| _| _| _| _| _| ")
message(" _| _| _| _| _| _| _| _| _| _| _| ")
message(" _| _| _|_|_| _| _|_|_| _| _|_|_| ")
message(" ")
message("========================================================================")
message(" 2019 preview 2 v0.4.2 ")
message("========================================================================")
message(" https://git.io/liblava lava-block.com ")
message("========================================================================")
if(CMAKE_COMPILER_IS_GNUCXX)
set_property(GLOBAL PROPERTY ALLOW_DUPLICATE_CUSTOM_TARGETS ON)
endif()
if(NOT DEFINED CMAKE_SUPPRESS_DEVELOPER_WARNINGS)
set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE INTERNAL "No dev warnings")
endif()
set(LIBLAVA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/liblava)
set(LIBLAVA_EXT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext)
set(LIBLAVA_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
# add_subdirectory(ext)
message(">> liblava/core")
if(CMAKE_COMPILER_IS_GNUCXX)
find_package (Threads)
endif()
add_library(lava.core INTERFACE)
target_include_directories(lava.core INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}
${LIBLAVA_EXT_DIR}/better-enums
${LIBLAVA_EXT_DIR}/glm
)
target_sources(lava.core INTERFACE
${LIBLAVA_DIR}/core/data.hpp
${LIBLAVA_DIR}/core/id.hpp
${LIBLAVA_DIR}/core/math.hpp
${LIBLAVA_DIR}/core/time.hpp
${LIBLAVA_DIR}/core/types.hpp
${LIBLAVA_DIR}/core/version.hpp
)
target_compile_features(lava.core INTERFACE
cxx_std_20
)
if(CMAKE_COMPILER_IS_GNUCXX)
target_link_libraries(lava.core INTERFACE
stdc++fs
${CMAKE_THREAD_LIBS_INIT}
)
endif()
message(">> liblava/utils")
add_library(lava.utils STATIC
${LIBLAVA_DIR}/utils/file.cpp
${LIBLAVA_DIR}/utils/file.hpp
${LIBLAVA_DIR}/utils/log.hpp
${LIBLAVA_DIR}/utils/random.hpp
${LIBLAVA_DIR}/utils/telegram.hpp
${LIBLAVA_DIR}/utils/thread.hpp
${LIBLAVA_DIR}/utils/utility.hpp
${LIBLAVA_EXT_DIR}/tinyfiledialogs/tinyfiledialogs.c
)
if(WIN32)
set_source_files_properties(${LIBLAVA_EXT_DIR}/tinyfiledialogs/tinyfiledialogs.c PROPERTIES COMPILE_FLAGS " /W0 ")
endif()
target_include_directories(lava.utils PUBLIC
${LIBLAVA_EXT_DIR}/spdlog/include
${LIBLAVA_EXT_DIR}/physfs/src
${LIBLAVA_EXT_DIR}/tinyfiledialogs
${LIBLAVA_EXT_DIR}/json/single_include
)
message(">>> ext/physfs")
set(PHYSFS_ARCHIVE_ZIP ON CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_7Z OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_GRP OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_WAD OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_HOG OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_MVL OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_QPAK OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_SLB OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_ISO9660 OFF CACHE BOOL "" FORCE)
set(PHYSFS_ARCHIVE_VDF OFF CACHE BOOL "" FORCE)
set(PHYSFS_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(PHYSFS_BUILD_TEST OFF CACHE BOOL "" FORCE)
add_subdirectory(${LIBLAVA_EXT_DIR}/physfs physfs EXCLUDE_FROM_ALL)
message("<<< ext/physfs")
target_link_libraries(lava.utils
lava.core
physfs-static
)
message(">> liblava/base")
add_library(lava.base STATIC
${LIBLAVA_DIR}/base/base.cpp
${LIBLAVA_DIR}/base/base.hpp
${LIBLAVA_DIR}/base/device.cpp
${LIBLAVA_DIR}/base/device.hpp
${LIBLAVA_DIR}/base/instance.cpp
${LIBLAVA_DIR}/base/instance.hpp
${LIBLAVA_DIR}/base/memory.cpp
${LIBLAVA_DIR}/base/memory.hpp
${LIBLAVA_DIR}/base/physical_device.cpp
${LIBLAVA_DIR}/base/physical_device.hpp
${LIBLAVA_EXT_DIR}/volk/volk.c
)
target_include_directories(lava.base PUBLIC
${LIBLAVA_EXT_DIR}/Vulkan-Headers/include
${LIBLAVA_EXT_DIR}/VulkanMemoryAllocator/src
${LIBLAVA_EXT_DIR}/volk
)
target_link_libraries(lava.base
lava.utils
${CMAKE_DL_LIBS}
)
message(">> liblava/resource")
option(LIBLAVA_ASSIMP "build assimp library" ON)
add_library(lava.resource STATIC
${LIBLAVA_DIR}/resource/buffer.cpp
${LIBLAVA_DIR}/resource/buffer.hpp
${LIBLAVA_DIR}/resource/format.cpp
${LIBLAVA_DIR}/resource/format.hpp
${LIBLAVA_DIR}/resource/image.cpp
${LIBLAVA_DIR}/resource/image.hpp
${LIBLAVA_DIR}/resource/mesh.cpp
${LIBLAVA_DIR}/resource/mesh.hpp
${LIBLAVA_DIR}/resource/texture.cpp
${LIBLAVA_DIR}/resource/texture.hpp
)
if(LIBLAVA_ASSIMP)
set(LIBLAVA_ASSIMP_INC ${LIBLAVA_EXT_DIR}/assimp/include)
set(LIBLAVA_ASSIMP_LIB assimp)
target_compile_definitions(lava.resource PRIVATE LIBLAVA_ASSIMP=1)
else()
set(LIBLAVA_ASSIMP_INC "")
set(LIBLAVA_ASSIMP_LIB "")
endif()
target_include_directories(lava.resource PUBLIC
${LIBLAVA_EXT_DIR}/stb
${LIBLAVA_EXT_DIR}/gli
${LIBLAVA_EXT_DIR}/tinyobjloader
${LIBLAVA_EXT_DIR}/bitmap
${LIBLAVA_EXT_DIR}/selene
${LIBLAVA_ASSIMP_INC}
)
message(">>> ext/assimp")
if(LIBLAVA_ASSIMP)
set(BUILD_SHARED_LIBS OFF)
set(ASSIMP_BUILD_TESTS OFF)
set(INJECT_DEBUG_POSTFIX OFF)
set(ASSIMP_BUILD_ASSIMP_TOOLS OFF)
add_subdirectory(${LIBLAVA_EXT_DIR}/assimp assimp EXCLUDE_FROM_ALL)
endif()
message("<<< ext/assimp")
message(">>> ext/selene")
add_subdirectory(${LIBLAVA_EXT_DIR}/selene selene EXCLUDE_FROM_ALL)
message("<<< ext/glfw")
target_link_libraries(lava.resource
lava.base
${LIBLAVA_ASSIMP_LIB}
)
message(">> liblava/frame")
add_library(lava.frame STATIC
${LIBLAVA_DIR}/frame/frame.cpp
${LIBLAVA_DIR}/frame/frame.hpp
${LIBLAVA_DIR}/frame/input.cpp
${LIBLAVA_DIR}/frame/input.hpp
${LIBLAVA_DIR}/frame/render_target.cpp
${LIBLAVA_DIR}/frame/render_target.hpp
${LIBLAVA_DIR}/frame/render_thread.hpp
${LIBLAVA_DIR}/frame/renderer.cpp
${LIBLAVA_DIR}/frame/renderer.hpp
${LIBLAVA_DIR}/frame/swapchain.cpp
${LIBLAVA_DIR}/frame/swapchain.hpp
${LIBLAVA_DIR}/frame/window.cpp
${LIBLAVA_DIR}/frame/window.hpp
)
target_include_directories(lava.frame PUBLIC
${LIBLAVA_EXT_DIR}/glfw/include
${LIBLAVA_EXT_DIR}/argh
)
message(">>> ext/glfw")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(${LIBLAVA_EXT_DIR}/glfw glfw EXCLUDE_FROM_ALL)
message("<<< ext/glfw")
target_link_libraries(lava.frame
lava.resource
glfw
${GLFW_LIBRARIES}
)
message(">> tests/driver")
add_executable(lava
${LIBLAVA_TESTS_DIR}/driver.cpp
${LIBLAVA_TESTS_DIR}/driver.hpp
${LIBLAVA_TESTS_DIR}/tests.cpp
)
target_link_libraries(lava lava.frame)
message("========================================================================")
\ No newline at end of file
LICENSE 0 → 100644
MIT License
Copyright (c) 2018-present, Lava Block OÜ
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
<p align="center"> <img align="left" src="https://raw.githubusercontent.com/liblava/liblava/master/res/texture/lava_block_logo_200.png">
<a href="https://lava-block.com">
<img src="https://raw.githubusercontent.com/liblava/liblava/master/doc/img/lava_block_logo_200.png"> **liblava is a modern and easy-to-use library for the <a href="https://www.khronos.org/vulkan/">Vulkan API</a>**
</a>
</p> liblava is a lean framework that provides essentials for low-level graphics and is specially well suited for prototyping, tooling and education.
+ C++20 standard
+ Modular (5 modules)
+ Cross Platform (Windows | Linux)
![version](https://img.shields.io/badge/version-0.4.2-blue) [![LoC](https://tokei.rs/b1/github/liblava/liblava?category=code)](https://github.com/liblava/liblava) [![Build Status](https://travis-ci.com/liblava/liblava.svg?branch=master)](https://travis-ci.com/liblava/liblava) [![Build status](https://ci.appveyor.com/api/projects/status/gxvjpo73qf637hy3?svg=true)](https://ci.appveyor.com/project/TheLavaBlock/liblava) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Follow)](https://twitter.com/thelavablock)
## features
* written in modern C++
* latest Vulkan API support
* run loop abstraction
* window and input handling
* render target and renderer
* load texture and mesh
* file system and logging
* test driver
* and much more...
WIP latest **<a href="https://github.com/liblava/liblava/releases">preview 2 / v0.4.2</a>** (Sep 18, 2019)
## hello frame
Let's write **Hello World** in Vulkan: *a simple program that just renders a colored window*
Well, just ? - Vulkan is a low-level, verbose graphics API and such a program can take several hundred lines of code.
All we need is a window, a device and a renderer.
The good news is that **liblava** will set up all for you.
```c++
#include <liblava/lava.h>
using namespace lava;
```
Here are a few examples to get to know `lava`.
#### 1. frame init
```c++
int main(int argc, char* argv[]) {
frame frame( {argc, argv} );
return frame.ready() ? 0 : error::not_ready;
}
```
This is how to initialize `lava::frame` with command line arguments.
#### 2. run loop
```c++
frame frame(argh);
if (!frame.ready())
return error::not_ready;
auto count = 0;
frame.add_run([&]() {
sleep(1.0);
count++;
log()->debug("{} - running {} sec", count, frame.get_running_time());
if (count == 3)
frame.shut_down();
return true;
});
return frame.run() ? 0 : error::aborted;
```
The last line performs a loop with the run we added before. If *count* reaches 3 it will exit.
#### 3. window input
Here is another example that shows how to create a window and handle input. This is straightforward.
```c++
frame frame(argh);
if (!frame.ready())
return error::not_ready;
window window;
if (!window.create())
return error::create_failed;
input input;
window.assign(&input);
input.key_listeners.add([&](key_event::ref event) {
if (event.key == GLFW_KEY_ESCAPE && event.action == GLFW_PRESS)
frame.shut_down();
});
frame.add_run([&]() {
handle_events(input);
if (window.has_close_request())
frame.shut_down();
return true;
});
return frame.run() ? 0 : error::aborted;
```
With this knowledge in hand let's write **hello frame**...
#### 4. clear color
```c++
frame frame(argh);
if (!frame.ready())
return error::not_ready;
window window;
if (!window.create())
return error::create_failed;
input input;
window.assign(&input);
input.key_listeners.add([&](key_event::ref event) {
if (event.key == GLFW_KEY_ESCAPE && event.action == GLFW_PRESS)
frame.shut_down();
});
auto device = frame.create_device();
if (!device)
return error::create_failed;
auto render_target = create_target(&window, device);
if (!render_target)
return error::create_failed;
renderer simple_renderer;
if (!simple_renderer.create(render_target->get_swapchain()))
return error::create_failed;
auto frame_count = render_target->get_frame_count();
VkCommandPool cmd_pool;
VkCommandBuffers cmd_bufs(frame_count);
auto build_cmd_bufs = [&]() {
VkCommandPoolCreateInfo create_info
{
.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
.queueFamilyIndex = device->get_graphics_queue().family_index,
};
if (!check(device->call().vkCreateCommandPool(device->get(), &create_info, memory::alloc(), &cmd_pool)))
return false;
VkCommandBufferAllocateInfo alloc_info
{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = cmd_pool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = frame_count,
};
if (!check(device->call().vkAllocateCommandBuffers(device->get(), &alloc_info, cmd_bufs.data())))
return false;
VkCommandBufferBeginInfo begin_info
{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
};
VkClearColorValue clear_color = { random(0.f, 1.f), random(0.f, 1.f), random(0.f, 1.f), 0.f };
VkImageSubresourceRange image_range
{
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.levelCount = 1,
.layerCount = 1,
};
for (auto i = 0u; i < frame_count; i++) {
auto cmd_buf = cmd_bufs[i];
auto target_image = render_target->get_backbuffer_image(i);
if (!check(device->call().vkBeginCommandBuffer(cmd_buf, &begin_info)))
return false;
insert_image_memory_barrier(device, cmd_buf, target_image,
VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
image_range);
device->call().vkCmdClearColorImage(cmd_buf, target_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
&clear_color, 1, &image_range);
insert_image_memory_barrier(device, cmd_buf, target_image,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
image_range);
if (!check(device->call().vkEndCommandBuffer(cmd_buf)))
return false;
}
return true;
};
auto clean_cmd_bufs = [&]() {
for (auto& cmd_buf : cmd_bufs)
device->call().vkFreeCommandBuffers(device->get(), cmd_pool, 1, &cmd_buf);
device->call().vkDestroyCommandPool(device->get(), cmd_pool, memory::alloc());
};
build_cmd_bufs();
render_target->on_swapchain_start = build_cmd_bufs;
render_target->on_swapchain_stop = clean_cmd_bufs;
frame.add_run([&]() {
handle_events(input);
if (window.has_close_request())
return frame.shut_down();
if (window.has_resize_request())
return window.handle_resize();
if (window.iconified()) {
frame.set_wait_for_events(true);
return true;
} else {
if (frame.waiting_for_events())
frame.set_wait_for_events(false);
}
auto frame_index = simple_renderer.begin_frame();
if (!frame_index)
return true;
return simple_renderer.end_frame({ cmd_bufs[*frame_index] });
});
frame.add_run_end([&]() {
clean_cmd_bufs();
simple_renderer.destroy();
render_target->destroy();
});
return frame.run() ? 0 : error::aborted;
```
Check the [Awesome Vulkan ecosystem](http://www.vinjn.com/awesome-vulkan/) to learn more about Vulkan (Tutorials/Samples/Books).
## tests
Run the driver to test [the above examples](https://github.com/liblava/liblava/blob/master/tests/tests.cpp).
List all tests:
```
$ lava -t
```
Run test 2 for example:
```
$ lava 2
```
## requirements
* **C++20** compatible compiler
* CMake **3.12+**
* [Vulkan SDK](https://vulkan.lunarg.com)
## build
```
$ git clone https://github.com/liblava/liblava.git
$ cd liblava
$ git submodule update --init --recursive
$ mkdir build
$ cd build
$ cmake ..
$ make
```
## third-party / license
* [argh](https://github.com/adishavit/argh) / 3-clause BSD
* [assimp](https://github.com/assimp/assimp) / modified 3-clause BSD
* [better-enums](https://github.com/aantron/better-enums) / 2-clause BSD
* [bitmap](https://github.com/ArashPartow/bitmap) / MIT
* [glfw](https://github.com/glfw/glfw) / zlib
* [gli](https://github.com/g-truc/gli) / MIT
* [glm](https://github.com/g-truc/glm) / MIT
* [json](https://github.com/nlohmann/json) / MIT
* [physfs](https://github.com/criptych/physfs) / zlib
* [selene](https://github.com/kmhofmann/selene) / MIT
* [spdlog](https://github.com/gabime/spdlog) / MIT
* [stb](https://github.com/nothings/stb) / MIT
* [tinyfiledialogs](https://github.com/native-toolkit/tinyfiledialogs) / zlib
* [tinyobjloader](https://github.com/syoyo/tinyobjloader) / MIT
* [volk](https://github.com/zeux/volk) / MIT
* [Vulkan-Headers](https://github.com/KhronosGroup/Vulkan-Headers) / Apache 2.0
* [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator) / MIT
## license
liblava is licensed under [MIT License](LICENSE.md) which allows you to use the software for any purpose you might like, including commercial and for-profit use. However, this library includes several third-party Open-Source libraries, which are licensed under their own respective Open-Source licenses. These licenses allow static linking with closed source software. All copies of liblava must include a copy of the MIT License terms and the copyright notice.
Copyright (c) 2018-present, <a href="https://lava-block.com">Lava Block OÜ</a>
<img src="https://raw.githubusercontent.com/liblava/liblava/master/res/texture/lava_block_logo_50.png">
\ No newline at end of file
Subproject commit 5b44df19e040fca0048ab30c553a8c2d2cb9623e
Subproject commit 909f36b714c9239ee0b112a321220213a474ba53
Subproject commit d4f5b4a2bf6fcf9c6a4f83c512fce9bbcf584b42
Subproject commit b6edcb35a8253699a18a5e97f0fc8169fcda175a
Subproject commit 4b76e7783bacf5220e0f29d19845a72d19ce0d6b
Subproject commit 624fb94c7e7986d1dda731fa15ee8fce4d7a13c4
Subproject commit 7105ff2dfd004a46bd732c1d0c9f461bae6d51b3
Subproject commit 559cbe1ec38878e182507d331e0780fbae5baf15
Subproject commit 7c07544b34c2f8655e4134239137d32aa2ccd5c8
Subproject commit ea60d40f4a60a47d3be9560d8f7bc37c163fe47b
Subproject commit b574ac6ec7f58aa29cd7bb1c785c962b5d155b5f
Subproject commit 27c90148b48c04f32b788abe724166b14234eda1
Subproject commit a51b4856377a71f81b6d74b9af459305c4c644f8
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment