diff --git a/engine/3rdparty/zlib/include/zstd/pool.h b/engine/3rdparty/zlib/include/zstd/pool.h index ee1d836..982ba62 100644 --- a/engine/3rdparty/zlib/include/zstd/pool.h +++ b/engine/3rdparty/zlib/include/zstd/pool.h @@ -1,3 +1,4 @@ +#pragma once #include namespace zstd { template diff --git a/engine/3rdparty/zlib/include/zstd/pool_static.h b/engine/3rdparty/zlib/include/zstd/pool_static.h index 6f77c86..deb67ae 100644 --- a/engine/3rdparty/zlib/include/zstd/pool_static.h +++ b/engine/3rdparty/zlib/include/zstd/pool_static.h @@ -1,3 +1,4 @@ +#pragma once #include namespace zstd { template diff --git a/engine/3rdparty/zlib/include/zthread/channel.h b/engine/3rdparty/zlib/include/zthread/channel.h index 5e681a6..525a814 100644 --- a/engine/3rdparty/zlib/include/zthread/channel.h +++ b/engine/3rdparty/zlib/include/zthread/channel.h @@ -1,3 +1,4 @@ +#pragma once #include #include #include diff --git a/engine/3rdparty/zlib/include/zthread/channel_static.h b/engine/3rdparty/zlib/include/zthread/channel_static.h index 4739ed1..d4caefe 100644 --- a/engine/3rdparty/zlib/include/zthread/channel_static.h +++ b/engine/3rdparty/zlib/include/zthread/channel_static.h @@ -1,3 +1,4 @@ +#pragma once #include #include #include diff --git a/engine/3rdparty/zlog/test/01file.cpp b/engine/3rdparty/zlog/test/01file.cpp index 2bc7556..b5b0d8f 100644 --- a/engine/3rdparty/zlog/test/01file.cpp +++ b/engine/3rdparty/zlog/test/01file.cpp @@ -1,8 +1,12 @@ #include #include "zlog.h" +#include "singleton.h" +#include "assetmanager.h" int main() { zlog::info("hello info"); zlog::warn("hello {}", "warn"); zlog::error("hello {}", "error"); + AssetManager re; + AssetManager::GetSingleton().GetSingleton(); return 0; } diff --git a/engine/3rdparty/zlog/test/assetmanager.cpp b/engine/3rdparty/zlog/test/assetmanager.cpp new file mode 100644 index 0000000..4ebd015 --- /dev/null +++ b/engine/3rdparty/zlog/test/assetmanager.cpp @@ -0,0 +1 @@ +#include "assetmanager.h" diff --git a/engine/3rdparty/zlog/test/assetmanager.h b/engine/3rdparty/zlog/test/assetmanager.h new file mode 100644 index 0000000..29fe76c --- /dev/null +++ b/engine/3rdparty/zlog/test/assetmanager.h @@ -0,0 +1,7 @@ +#pragma once +#include "singleton.h" +class AssetManager :public Singleton { + +}; +template<> +AssetManager* Singleton::ms_Singleton = nullptr; \ No newline at end of file diff --git a/engine/3rdparty/zlog/test/singleton.h b/engine/3rdparty/zlog/test/singleton.h new file mode 100644 index 0000000..6532128 --- /dev/null +++ b/engine/3rdparty/zlog/test/singleton.h @@ -0,0 +1,20 @@ +#pragma once + +template +class Singleton { +protected: + static T* ms_Singleton; +public: + explicit Singleton() { + ms_Singleton = static_cast(this); + } + ~Singleton() { + ms_Singleton = nullptr; + } + static T& GetSingleton(void) { + return *ms_Singleton; + } + static T* GetSingletonPtr(void) { + return ms_Singleton; + } +}; \ No newline at end of file diff --git a/engine/3rdparty/zlog/xmake.lua b/engine/3rdparty/zlog/xmake.lua index c00c0fc..76e86f0 100644 --- a/engine/3rdparty/zlog/xmake.lua +++ b/engine/3rdparty/zlog/xmake.lua @@ -10,4 +10,5 @@ target("zlog_test01_file") set_languages("cxx20") set_kind("binary") add_deps("zlog") - add_files("test/01file.cpp") \ No newline at end of file + add_files("test/*.cpp") + add_headerfiles("test/*.h") \ No newline at end of file diff --git a/engine/src/3rdparty/template/singleton.h b/engine/src/3rdparty/template/singleton.h new file mode 100644 index 0000000..6532128 --- /dev/null +++ b/engine/src/3rdparty/template/singleton.h @@ -0,0 +1,20 @@ +#pragma once + +template +class Singleton { +protected: + static T* ms_Singleton; +public: + explicit Singleton() { + ms_Singleton = static_cast(this); + } + ~Singleton() { + ms_Singleton = nullptr; + } + static T& GetSingleton(void) { + return *ms_Singleton; + } + static T* GetSingletonPtr(void) { + return ms_Singleton; + } +}; \ No newline at end of file diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp new file mode 100644 index 0000000..256e9aa --- /dev/null +++ b/engine/src/engine/app.cpp @@ -0,0 +1,51 @@ +#include "app.h" +#include "render/renderapi.h" +#include "render/window.h" +#include "object/mesh/actor.h" +#include "object/property/actor_property.h" +#include "asset/asset_manager.h" +#include "object/scene/scene_manager.h" +namespace engineapi { + App::App(const string& path) + { + const char* name = "zengine"; + RenderAPI::MakeInstance(); + Window::MakeInstance(3, 640, 720, name); + auto scene_manager = new SceneManager(); + scene_manager->LoadScene(path); + new AssetManager(); + { + ActorProperty property; + property.id = 1; + property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; + property.path = "assets/models/cube.obj"; + auto actor = ActorMesh::New(property); + } + { + ActorProperty property; + property.id = 1; + property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; + property.path = "assets/models/box.ply"; + auto actor = ActorMesh::New(property); + } + } + void App::Launch() + { + while (true) { + Update(); + Render(); + } + } + void App::Update() + { + SceneManager::GetSingletonPtr()->GetCurScene()->Update(); + } + void App::Render() + { + RenderAPI::GetSingletonPtr()->BeginFrame(); + + SceneManager::GetSingletonPtr()->GetCurScene()->Render(); + + RenderAPI::GetSingletonPtr()->EndFrame(); + } +} diff --git a/engine/src/engine/app.h b/engine/src/engine/app.h new file mode 100644 index 0000000..b2d218f --- /dev/null +++ b/engine/src/engine/app.h @@ -0,0 +1,16 @@ +#pragma once +#include +using std::string; +namespace engineapi +{ + class App { + protected: + + public: + App(const string& path); + void Launch(); + public: + void Update(); + void Render(); + }; +} \ No newline at end of file diff --git a/engine/src/engine/asset/asset_manager.cpp b/engine/src/engine/asset/asset_manager.cpp index 287f65b..cae6ba4 100644 --- a/engine/src/engine/asset/asset_manager.cpp +++ b/engine/src/engine/asset/asset_manager.cpp @@ -1,6 +1,4 @@ #include "asset/asset_manager.h" - namespace engineapi { - AssetManager* AssetManager::Instance = nullptr; } diff --git a/engine/src/engine/asset/asset_manager.h b/engine/src/engine/asset/asset_manager.h index 61de6c7..8e94f46 100644 --- a/engine/src/engine/asset/asset_manager.h +++ b/engine/src/engine/asset/asset_manager.h @@ -4,9 +4,10 @@ #include #include #include "asset.h" +#include "singleton.h" namespace engineapi { - class AssetManager + class AssetManager : public Singleton { public: struct AssetWrap { @@ -41,7 +42,9 @@ namespace engineapi asset->BeginLoad(); return asset; } - public: - static AssetManager* Instance; + + AssetManager() = default; }; } +template<> +engineapi::AssetManager* Singleton::ms_Singleton = nullptr; diff --git a/engine/src/engine/object/component.cpp b/engine/src/engine/object/component.cpp new file mode 100644 index 0000000..6409214 --- /dev/null +++ b/engine/src/engine/object/component.cpp @@ -0,0 +1,10 @@ +#include "component.h" + +namespace engineapi { + Component::Component() + { + } + Component::~Component() + { + } +} diff --git a/engine/src/engine/object/component.h b/engine/src/engine/object/component.h new file mode 100644 index 0000000..4c13986 --- /dev/null +++ b/engine/src/engine/object/component.h @@ -0,0 +1,9 @@ +#pragma once +namespace engineapi { + class Component { + protected: + public: + Component(); + ~Component(); + }; +}; \ No newline at end of file diff --git a/engine/src/engine/object/game_object.cpp b/engine/src/engine/object/game_object.cpp new file mode 100644 index 0000000..4297d5d --- /dev/null +++ b/engine/src/engine/object/game_object.cpp @@ -0,0 +1,10 @@ +#include "game_object.h" + +namespace engineapi { + GameObject::GameObject() + { + } + GameObject::~GameObject() + { + } +} diff --git a/engine/src/engine/object/game_object.h b/engine/src/engine/object/game_object.h new file mode 100644 index 0000000..03bf991 --- /dev/null +++ b/engine/src/engine/object/game_object.h @@ -0,0 +1,10 @@ +#pragma once +#include "component.h" +namespace engineapi { + class GameObject { + protected: + public: + GameObject(); + ~GameObject(); + }; +}; \ No newline at end of file diff --git a/engine/src/engine/object/mesh/actor.cpp b/engine/src/engine/object/mesh/actor.cpp index abfdec2..9c9d18f 100644 --- a/engine/src/engine/object/mesh/actor.cpp +++ b/engine/src/engine/object/mesh/actor.cpp @@ -10,7 +10,7 @@ namespace engineapi { } ActorMesh* ActorMesh::New(ActorProperty& property) { - Model* model = AssetManager::Instance->LoadAsset(property.path, property.flags); + Model* model = AssetManager::GetSingletonPtr()->LoadAsset(property.path, property.flags); return new ActorMesh(*model, property); } ActorMesh* ActorMesh::New(uint32_t id) diff --git a/engine/src/engine/object/scene/scene.cpp b/engine/src/engine/object/scene/scene.cpp new file mode 100644 index 0000000..8dcc9da --- /dev/null +++ b/engine/src/engine/object/scene/scene.cpp @@ -0,0 +1,18 @@ +#include "scene.h" +namespace engineapi { + Scene::Scene() + { + } + Scene::~Scene() + { + } + void Scene::Update() + { + } + void Scene::Render() + { + } + void Scene::AddGameObject(GameObject* gameObject) + { + } +} diff --git a/engine/src/engine/object/scene/scene.h b/engine/src/engine/object/scene/scene.h new file mode 100644 index 0000000..0bab6c1 --- /dev/null +++ b/engine/src/engine/object/scene/scene.h @@ -0,0 +1,14 @@ +#pragma once +#include "../game_object.h" +namespace engineapi { + class Scene{ + protected: + public: + Scene(); + ~Scene(); + + void Update(); + void Render(); + void AddGameObject(GameObject* gameObject); + }; +} \ No newline at end of file diff --git a/engine/src/engine/object/scene/scene_manager.cpp b/engine/src/engine/object/scene/scene_manager.cpp new file mode 100644 index 0000000..536c14b --- /dev/null +++ b/engine/src/engine/object/scene/scene_manager.cpp @@ -0,0 +1,75 @@ +#include "scene_manager.h" +#include "zlog.h" +namespace engineapi { + Scene* SceneManager::GetScene(const string& name) + { + auto sceneInfo = GetSceneInfo(name); + if (sceneInfo == nullptr) + { + return nullptr; + } + else + { + return sceneInfo->scene; + } + } + + void SceneManager::LoadScene(const string& path, bool switchNow) + { + curScene = new SceneInfo{ + path, + new Scene() + }; + } + + void SceneManager::SwitchScene(const string& name) + { + + } + + void SceneManager::DeleteScene(const string& name) + { + map::iterator iter = scenes.find(name); + if (iter != scenes.end()) + { + delete iter->second->scene; + delete iter->second; + scenes.erase(iter); + } + else + { + zlog::info("Attempt to delete a nonexistent scene: {}", name); + } + } + + void SceneManager::DeleteAllScene() + { + for (auto& iter : scenes) + { + delete iter.second->scene; + delete iter.second; + } + scenes.clear(); + } + + void SceneManager::ReloadScene() + { + // 先等待当前所有绘制结束,再卸载场景释放资源 + + } + + Scene* SceneManager::GetCurScene() + { + return curScene->scene; + } + + SceneInfo* SceneManager::GetSceneInfo(const string& name) + { + map::iterator iter = scenes.find(name); + if (iter != scenes.end()) + return iter->second; + else + return nullptr; + } +} + diff --git a/engine/src/engine/object/scene/scene_manager.h b/engine/src/engine/object/scene/scene_manager.h new file mode 100644 index 0000000..060cb61 --- /dev/null +++ b/engine/src/engine/object/scene/scene_manager.h @@ -0,0 +1,27 @@ +#pragma once +#include "asset/asset.h" +#include "scene.h" +#include "singleton.h" +namespace engineapi { + struct SceneInfo + { + string path; + Scene* scene = nullptr; + }; + class SceneManager :public Singleton { + protected: + SceneInfo* curScene = nullptr; + map scenes; + public: + Scene* GetScene(const string& name); + void LoadScene(const string& path, bool switchNow = true); + void SwitchScene(const string& name); + void DeleteScene(const string& name); + void DeleteAllScene(); + void ReloadScene(); + Scene* GetCurScene(); + SceneInfo* GetSceneInfo(const string& name); + }; +} +template<> +engineapi::SceneManager* Singleton::ms_Singleton = nullptr; \ No newline at end of file diff --git a/engine/src/engine/render/asset/mesh.cpp b/engine/src/engine/render/asset/mesh.cpp index 2be7d0a..ac0f679 100644 --- a/engine/src/engine/render/asset/mesh.cpp +++ b/engine/src/engine/render/asset/mesh.cpp @@ -11,6 +11,6 @@ namespace engineapi { void Mesh::BeginLoad() { Asset::BeginLoad(); - RenderAPI::GetInstance()->SetStaticMesh(this); + RenderAPI::GetSingletonPtr()->SetStaticMesh(this); } } diff --git a/engine/src/engine/render/renderapi.cpp b/engine/src/engine/render/renderapi.cpp index c209099..7c964e2 100644 --- a/engine/src/engine/render/renderapi.cpp +++ b/engine/src/engine/render/renderapi.cpp @@ -1,16 +1,13 @@ #include "renderapi.h" -#define VULKAN_API #ifdef VULKAN_API #include "vulkanapi/vulkanapi.h" #endif // VULKAN_API - namespace engineapi { - RenderAPI* RenderAPI::Instance = nullptr; void RenderAPI::MakeInstance() { #ifdef VULKAN_API - Instance = new RenderVulkanAPI(); + new RenderVulkanAPI(); #endif } } \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.h b/engine/src/engine/render/renderapi.h index 0bd4a22..1a1257a 100644 --- a/engine/src/engine/render/renderapi.h +++ b/engine/src/engine/render/renderapi.h @@ -1,19 +1,18 @@ #pragma once #include "asset/asset_render.h" +#include "singleton.h" namespace engineapi { class Mesh; - class RenderAPI + class RenderAPI : public Singleton { public: virtual void BeginFrame() = 0; virtual void EndFrame() = 0; virtual void SetStaticMesh(Mesh* mesh) = 0; public: - static RenderAPI* Instance; static void MakeInstance(); - static RenderAPI* GetInstance() { - return Instance; - } }; -} \ No newline at end of file +} +template<> +engineapi::RenderAPI* Singleton::ms_Singleton = nullptr; \ No newline at end of file diff --git a/engine/src/engine/render/window.cpp b/engine/src/engine/render/window.cpp index 8aee455..e0707c1 100644 --- a/engine/src/engine/render/window.cpp +++ b/engine/src/engine/render/window.cpp @@ -1,7 +1,15 @@ #include "window.h" +#ifdef VULKAN_API +#include "vulkanapi/window.h" +#endif // VULKAN_API namespace engineapi { Window::WindowClass Window::WindowClass::wndClass; - Window* Window::Instance = nullptr; + void Window::MakeInstance(int frames, uint32_t width, uint32_t height, const char* title) + { +#ifdef VULKAN_API + new vulkanapi::Window(frames, width, height, title); +#endif + } Window::WindowClass::WindowClass() noexcept : hInst(GetModuleHandle(nullptr)) diff --git a/engine/src/engine/render/window.h b/engine/src/engine/render/window.h index c619d71..58e8b7e 100644 --- a/engine/src/engine/render/window.h +++ b/engine/src/engine/render/window.h @@ -1,7 +1,9 @@ #pragma once #include +#include +#include "singleton.h" namespace engineapi { - class Window { + class Window : public Singleton { protected: int mWidth; int mHeight; @@ -33,9 +35,8 @@ namespace engineapi { return mPtr; } static bool ProcessMessages(int& code); - static Window* Instance; - static Window* GetInstance() { - return Instance; - } + static void MakeInstance(int frames, uint32_t width, uint32_t height, const char* title); }; -}; \ No newline at end of file +}; +template<> +engineapi::Window* Singleton::ms_Singleton = nullptr; \ No newline at end of file diff --git a/engine/src/engine/run.cpp b/engine/src/engine/run.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/engine/src/engine/run.h b/engine/src/engine/run.h deleted file mode 100644 index e69de29..0000000 diff --git a/engine/src/engine/vulkanapi/backend.cpp b/engine/src/engine/vulkanapi/backend.cpp index ebf3bf1..ff8f616 100644 --- a/engine/src/engine/vulkanapi/backend.cpp +++ b/engine/src/engine/vulkanapi/backend.cpp @@ -18,10 +18,10 @@ namespace vulkanapi { deviceCreator.AddQueue(Queue::PresentQueue, VkQueueFlagBits::VK_QUEUE_GRAPHICS_BIT, 1.0); mDevice = new Device(deviceCreator); - InitWorker(Queue::TransferQueue, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT); - InitWorker(Queue::RenderQueue, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT); - InitWorker(Queue::ComputeQueue, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT); - InitWorker(Queue::PresentQueue, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT); + InitWorker(Queue::TransferQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + InitWorker(Queue::RenderQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + InitWorker(Queue::ComputeQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + InitWorker(Queue::PresentQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); Backend::TransferWorker = GetWorker(Queue::TransferQueue); } diff --git a/engine/src/engine/vulkanapi/thread/worker.cpp b/engine/src/engine/vulkanapi/thread/worker.cpp index 7ee2c49..f99255b 100644 --- a/engine/src/engine/vulkanapi/thread/worker.cpp +++ b/engine/src/engine/vulkanapi/thread/worker.cpp @@ -28,6 +28,7 @@ namespace vulkanapi { void CommandWorker::Buffer(CommandBuffer& cmd, commandFn fn, voidFn callback) { + cmd.Reset(); cmd.BeginRecord(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); fn(cmd); cmd.EndRecord(); diff --git a/engine/src/engine/vulkanapi/vulkanapi.h b/engine/src/engine/vulkanapi/vulkanapi.h index 03d9cd9..821b2b5 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.h +++ b/engine/src/engine/vulkanapi/vulkanapi.h @@ -19,8 +19,8 @@ namespace engineapi public: VulkanVAO* GetNextVAO(uint32_t& VAO_index); public: - static RenderVulkanAPI* GetInstance() { - return (RenderVulkanAPI*)RenderAPI::GetInstance(); + static RenderVulkanAPI* GetSingletonPtr() { + return (RenderVulkanAPI*)RenderAPI::GetSingletonPtr(); } }; } \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/window.cpp b/engine/src/engine/vulkanapi/window.cpp index 2c8989d..572941e 100644 --- a/engine/src/engine/vulkanapi/window.cpp +++ b/engine/src/engine/vulkanapi/window.cpp @@ -13,7 +13,7 @@ namespace vulkanapi { , mSurfaceKHR(nullptr) , mSwapchain(nullptr) { - RenderVulkanAPI* api = RenderVulkanAPI::GetInstance(); + RenderVulkanAPI* api = RenderVulkanAPI::GetSingletonPtr(); if (!api) { zlog::error("init RenderAPI error,Window is rely on RenderAPI!"); return; diff --git a/engine/src/engine/vulkanapi/wrapper/commandbuffer.cpp b/engine/src/engine/vulkanapi/wrapper/commandbuffer.cpp index 744ca3c..297a98c 100644 --- a/engine/src/engine/vulkanapi/wrapper/commandbuffer.cpp +++ b/engine/src/engine/vulkanapi/wrapper/commandbuffer.cpp @@ -31,6 +31,7 @@ namespace vulkanapi { void CommandBuffer::Reset() { vkResetCommandBuffer(mPtr, VkCommandBufferResetFlagBits::VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); + mPool.ResetFence(mFence); } void CommandBuffer::BeginRecord(VkCommandBufferUsageFlags flag) { diff --git a/engine/src/engine/vulkanapi/wrapper/commandpool.cpp b/engine/src/engine/vulkanapi/wrapper/commandpool.cpp index 545d6ff..a81ede3 100644 --- a/engine/src/engine/vulkanapi/wrapper/commandpool.cpp +++ b/engine/src/engine/vulkanapi/wrapper/commandpool.cpp @@ -42,6 +42,10 @@ namespace vulkanapi { vkDestroyFence(mDevice.Ptr(), fence, NULL); fence = nullptr; } + void CommandPool::ResetFence(VkFence& fence) + { + vkResetFences(mDevice.Ptr(), 1, &fence); + } VkFence CommandPool::AllocateFence() { VkFence fence; diff --git a/engine/src/engine/vulkanapi/wrapper/commandpool.h b/engine/src/engine/vulkanapi/wrapper/commandpool.h index 7974df0..1537bcb 100644 --- a/engine/src/engine/vulkanapi/wrapper/commandpool.h +++ b/engine/src/engine/vulkanapi/wrapper/commandpool.h @@ -17,6 +17,7 @@ namespace vulkanapi { VkCommandBuffer AllocateBuffer(VkCommandBufferLevel level); void FreeBuffer(VkCommandBuffer& buf); void FreeFence(VkFence& fence); + void ResetFence(VkFence& fence); VkFence AllocateFence(); VkCommandPool& Ptr() { return mPtr; diff --git a/engine/src/main.cpp b/engine/src/main.cpp index 719ee3d..77ccd0f 100644 --- a/engine/src/main.cpp +++ b/engine/src/main.cpp @@ -1,28 +1,12 @@ #include #include -#include "vulkanapi/window.h" -#include "object/mesh/actor.h" -#include "object/property/actor_property.h" -#include "asset/asset_manager.h" -#include "render/renderapi.h" +#include "app.h" #include "zlog.h" using namespace engineapi; int main(int argc, char** argv) { const char* name = "zengine"; - zlog::info("hello {}", name); - RenderAPI::MakeInstance(); - auto wnd = vulkanapi::Window(3, 640, 720, name); - ActorProperty property; - property.id = 1; - property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; - property.path = "assets/models/cube.obj"; - AssetManager instance; - AssetManager::Instance = &instance; - auto actor = ActorMesh::New(property); - while (true) { - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - } - delete actor; + App game(name); + game.Launch(); return 0; } diff --git a/engine/xmake.lua b/engine/xmake.lua index c738598..8e22197 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -7,9 +7,10 @@ target("zengine") set_rundir(".") add_rules("volk.env") add_deps("zlib","zlog") + add_defines("VULKAN_API") add_packages("vulkansdk","tinyobjloader","assimp") add_includedirs("src/engine") - add_includedirs("src/3rdparty/volk", "src/3rdparty/vulkan-memory-allocator") + add_includedirs("src/3rdparty/volk", "src/3rdparty/vulkan-memory-allocator", "src/3rdparty/template") add_syslinks("user32") add_files("src/*.cpp", "src/**.cpp") add_files("src/3rdparty/**.c")