summaryrefslogtreecommitdiff
path: root/src/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.cpp')
-rw-r--r--src/core.cpp748
1 files changed, 148 insertions, 600 deletions
diff --git a/src/core.cpp b/src/core.cpp
index f524e36..7e5253b 100644
--- a/src/core.cpp
+++ b/src/core.cpp
@@ -38,62 +38,9 @@
#include <sstream>
#endif
-std::random_device random_seed;
-std::mt19937 random_number_generator;
-
namespace
{
-#ifdef DEBUG
-VKAPI_ATTR VkBool32 VKAPI_CALL
-vk_debug_callback(
- VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
- VkDebugUtilsMessageTypeFlagsEXT message_type,
- const VkDebugUtilsMessengerCallbackDataEXT* callback_data,
- void* _obj)
-{
- // Set level.
- Log::Level log_level;
- switch(message_severity)
- {
- case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT:
- log_level = Log::Level::Trace;
- break;
- case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
- log_level = Log::Level::Information;
- break;
- case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
- log_level = Log::Level::Warning;
- break;
- case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
- default:
- log_level = Log::Level::Error;
- break;
- }
-
- // Log message.
- cg_core.log.message(log_level, callback_data->pMessage);
-
- return VK_FALSE;
-}
-#endif
-
-void
-load_threads(void *obj)
-{
- auto num_threads{std::thread::hardware_concurrency() - 1};
- for(auto i{0}; i < num_threads; i++)
- cg_core.threads.emplace_back(
- cg_core.workers.emplace_back(&cg_core.job_queue));
-}
-
-void
-unload_threads(void *obj)
-{
- cg_core.job_queue.stop();
- for(auto &t: cg_core.threads) t.join();
-}
-
void
load_mruby_symbols(void *obj)
{
@@ -114,27 +61,24 @@ load_mruby_symbols(void *obj)
void
load_game(void *obj)
{
- using namespace std::chrono;
-
FILE *fp;
mrb_value main_obj{mrb_top_self(cg_core.mrb)};
- cg_core.game_name = "CandyGear Game";
+ BluCat::core.game_name = "CandyGear Game";
- cg_core.display_width = 800;
- cg_core.display_height = 600;
+ BluCat::core.display_width = 800;
+ BluCat::core.display_height = 600;
- cg_core.game_version_major = 0;
- cg_core.game_version_minor = 1;
- cg_core.game_version_patch = 0;
+ BluCat::core.game_version_major = 0;
+ BluCat::core.game_version_minor = 1;
+ BluCat::core.game_version_patch = 0;
- cg_core.fps = 30;
+ BluCat::core.fps = 30;
mrb_define_module(cg_core.mrb, "CandyGear");
cg_candy_gear_init_config(cg_core.mrb);
cg_graphic_init_config(cg_core.mrb);
-
fp = fopen(cg_core.game_file.c_str(), "rb");
mrb_load_irep_file(cg_core.mrb, fp);
fclose(fp);
@@ -153,11 +97,6 @@ load_game(void *obj)
cg_candy_gear_finish_config(cg_core.mrb);
cg_graphic_finish_config(cg_core.mrb);
-
- cg_core.max_frame_duration =
- duration<long long, std::milli>(1000 / cg_core.fps);
- // FIXME: actually calculates the real delta time.
- cg_core.delta_time = 1.0f / cg_core.fps;
}
void
@@ -227,8 +166,9 @@ load_window(void *obj)
{
cg_core.window = NULL;
cg_core.window = SDL_CreateWindow(
- cg_core.game_name.c_str(), SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED, cg_core.display_width, cg_core.display_height,
+ BluCat::core.game_name.c_str(),
+ SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+ BluCat::core.display_width, BluCat::core.display_height,
SDL_WINDOW_VULKAN);
if(cg_core.window == NULL)
{
@@ -245,168 +185,156 @@ unload_window(void *obj)
}
void
-load_font_library(void *obj)
-{
- FT_Error error{FT_Init_FreeType(&cg_core.font_library)};
- if(error) throw CommandError{"Failed to open the FreeType library."};
-}
-
-void
-unload_font_library(void *obj)
-{
- FT_Done_FreeType(cg_core.font_library);
-}
-
-void
-load_blucat_instance(void *obj)
+load_vk_instance(void *obj)
{
- std::vector<const char*> vk_extensions;
- std::vector<const char*> vk_required_layers_names;
+ std::vector<const char*> vk_extensions;
+ std::vector<const char*> vk_required_layers_names;
- // Get extensions.
- {
- uint32_t vk_extensions_count;
- std::vector<const char*> vk_required_extensions;
+ // Get extensions.
+ {
+ uint32_t vk_extensions_count;
+ std::vector<const char*> vk_required_extensions;
- // Load debuging layers.
+ // Load debuging layers.
#ifdef DEBUG
- vk_required_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
- vk_required_layers_names.push_back("VK_LAYER_KHRONOS_validation");
+ vk_required_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
+ vk_required_layers_names.push_back("VK_LAYER_KHRONOS_validation");
#endif
- // Get extensions for SDL.
- {
- uint32_t vk_sdl_extension_count;
- std::vector<const char*> vk_sdl_extensions;
-
- if(!SDL_Vulkan_GetInstanceExtensions(
- cg_core.window, &vk_sdl_extension_count, nullptr))
- {
- std::string error{
- "Vulkan extensions could not be loaded by SDL! SDL_Error: "};
- error += SDL_GetError();
- throw CommandError{error};
- }
-
- vk_sdl_extensions.resize(vk_sdl_extension_count);
- SDL_Vulkan_GetInstanceExtensions(
- cg_core.window, &vk_sdl_extension_count, vk_sdl_extensions.data());
-
- // Combine all extensions.
- vk_extensions_count = vk_sdl_extension_count +
- vk_required_extensions.size();
- vk_extensions.resize(vk_extensions_count);
- for(auto i{0}; i < vk_sdl_extension_count; i++)
- vk_extensions[i] = vk_sdl_extensions[i];
- for(auto i{0}; i < vk_required_extensions.size(); i++)
- vk_extensions[i + vk_sdl_extension_count] = vk_required_extensions[i];
- }
+ // Get extensions for SDL.
+ {
+ uint32_t vk_sdl_extension_count;
+ std::vector<const char*> vk_sdl_extensions;
+
+ if(!SDL_Vulkan_GetInstanceExtensions(
+ cg_core.window, &vk_sdl_extension_count, nullptr))
+ {
+ std::string error{
+ "Vulkan extensions could not be loaded by SDL! SDL_Error: "};
+ error += SDL_GetError();
+ throw CommandError{error};
+ }
+
+ vk_sdl_extensions.resize(vk_sdl_extension_count);
+ SDL_Vulkan_GetInstanceExtensions(
+ cg_core.window, &vk_sdl_extension_count, vk_sdl_extensions.data());
+
+ // Combine all extensions.
+ vk_extensions_count = vk_sdl_extension_count +
+ vk_required_extensions.size();
+ vk_extensions.resize(vk_extensions_count);
+ for(auto i{0}; i < vk_sdl_extension_count; i++)
+ vk_extensions[i] = vk_sdl_extensions[i];
+ for(auto i{0}; i < vk_required_extensions.size(); i++)
+ vk_extensions[i + vk_sdl_extension_count] = vk_required_extensions[i];
+ }
#ifdef DEBUG
- cg_core.log.message(Log::Level::Trace, "Enabled VK extensions.");
- for(auto vk_extension: vk_extensions)
- {
- std::string message{"Extension name: "};
- message += vk_extension;
- cg_core.log.message(Log::Level::Trace, message);
- }
+ BluCat::core.log.message(Log::Level::Trace, "Enabled VK extensions.");
+ for(auto vk_extension: vk_extensions)
+ {
+ std::string message{"Extension name: "};
+ message += vk_extension;
+ BluCat::core.log.message(Log::Level::Trace, message);
+ }
#endif
- }
-
- // Get available instance layers.
- {
- uint32_t vk_available_layers_count;
- std::vector<VkLayerProperties> vk_available_layers;
- std::vector<const char*> vk_available_layers_names;
-
- vkEnumerateInstanceLayerProperties(&vk_available_layers_count, nullptr);
- vk_available_layers.resize(vk_available_layers_count);
- vkEnumerateInstanceLayerProperties(&vk_available_layers_count,
- vk_available_layers.data());
- vk_available_layers_names.resize(vk_available_layers_count);
+ }
+
+ // Get available instance layers.
+ {
+ uint32_t vk_available_layers_count;
+ std::vector<VkLayerProperties> vk_available_layers;
+ std::vector<const char*> vk_available_layers_names;
+
+ vkEnumerateInstanceLayerProperties(&vk_available_layers_count, nullptr);
+ vk_available_layers.resize(vk_available_layers_count);
+ vkEnumerateInstanceLayerProperties(&vk_available_layers_count,
+ vk_available_layers.data());
+ vk_available_layers_names.resize(vk_available_layers_count);
#ifdef DEBUG
- cg_core.log.message(Log::Level::Trace, "Available VK instance layers.");
+ BluCat::core.log.message(
+ Log::Level::Trace, "Available VK instance layers.");
#endif
- for(uint32_t i = 0; i < vk_available_layers_count; i++)
- {
+ for(uint32_t i = 0; i < vk_available_layers_count; i++)
+ {
#ifdef DEBUG
- std::stringstream message{};
- message << "\nname: " << vk_available_layers[i].layerName << std::endl;
- message << "Description: " << vk_available_layers[i].description <<
- std::endl;
- message << "Spec version: " << vk_available_layers[i].specVersion <<
- std::endl;
- message << "Implementation version: " <<
- vk_available_layers[i].implementationVersion << std::endl;
- cg_core.log.message(Log::Level::Trace, message.str());
+ std::stringstream message{};
+ message << "\nname: " << vk_available_layers[i].layerName << std::endl;
+ message << "Description: " << vk_available_layers[i].description <<
+ std::endl;
+ message << "Spec version: " << vk_available_layers[i].specVersion <<
+ std::endl;
+ message << "Implementation version: " <<
+ vk_available_layers[i].implementationVersion << std::endl;
+ BluCat::core.log.message(Log::Level::Trace, message.str());
#endif
- vk_available_layers_names[i] = vk_available_layers[i].layerName;
- }
-
- // If required layers are not all available.
- if(!std::includes(
- vk_available_layers_names.begin(), vk_available_layers_names.end(),
- vk_required_layers_names.begin(), vk_required_layers_names.begin()))
- throw CommandError{"Some required Vulkan layers are not available."};
- }
-
- {
- VkApplicationInfo app_info;
- app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
- app_info.pNext = nullptr;
- app_info.pApplicationName = cg_core.game_name.c_str();
- app_info.applicationVersion = VK_MAKE_VERSION(
- cg_core.game_version_major,
- cg_core.game_version_minor,
- cg_core.game_version_patch);
- app_info.pEngineName = "CandyGear";
- app_info.engineVersion = VK_MAKE_VERSION(
- CANDY_GEAR_VERSION_MAJOR,
- CANDY_GEAR_VERSION_MINOR,
- CANDY_GEAR_VERSION_PATCH);
- app_info.apiVersion = VK_API_VERSION_1_0;
-
- VkInstanceCreateInfo create_info;
- create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
- create_info.pNext = nullptr;
- create_info.flags = 0;
- create_info.pApplicationInfo = &app_info;
- create_info.enabledExtensionCount = vk_extensions.size();
- create_info.ppEnabledExtensionNames = vk_extensions.data();
- create_info.enabledLayerCount = vk_required_layers_names.size();
- create_info.ppEnabledLayerNames = vk_required_layers_names.data();
-
- VkResult result =
- vkCreateInstance(&create_info, nullptr, &cg_core.vk_instance);
- if(result != VK_SUCCESS)
- {
- std::string error{""};
- switch(result)
- {
- case VK_ERROR_LAYER_NOT_PRESENT:
- error = " Layer not present.";
- break;
- case VK_ERROR_EXTENSION_NOT_PRESENT:
- error = " Extension not present.";
- }
- error = "Failed to create Vulkan instance." + error;
- throw CommandError{error};
- }
- }
-}
-
-void
-unload_blucat_instance(void *obj)
-{
- vkDestroyInstance(cg_core.vk_instance, nullptr);
+ vk_available_layers_names[i] = vk_available_layers[i].layerName;
+ }
+
+ // If required layers are not all available.
+ if(!std::includes(
+ vk_available_layers_names.begin(), vk_available_layers_names.end(),
+ vk_required_layers_names.begin(), vk_required_layers_names.begin()))
+ throw CommandError{"Some required Vulkan layers are not available."};
+ }
+
+ {
+ VkApplicationInfo app_info;
+ app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
+ app_info.pNext = nullptr;
+ app_info.pApplicationName = BluCat::core.game_name.c_str();
+ app_info.applicationVersion = VK_MAKE_VERSION(
+ BluCat::core.game_version_major,
+ BluCat::core.game_version_minor,
+ BluCat::core.game_version_patch);
+ app_info.pEngineName = "CandyGear";
+ app_info.engineVersion = VK_MAKE_VERSION(
+ CANDY_GEAR_VERSION_MAJOR,
+ CANDY_GEAR_VERSION_MINOR,
+ CANDY_GEAR_VERSION_PATCH);
+ app_info.apiVersion = VK_API_VERSION_1_0;
+
+ VkInstanceCreateInfo create_info;
+ create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ create_info.pNext = nullptr;
+ create_info.flags = 0;
+ create_info.pApplicationInfo = &app_info;
+ create_info.enabledExtensionCount = vk_extensions.size();
+ create_info.ppEnabledExtensionNames = vk_extensions.data();
+ create_info.enabledLayerCount = vk_required_layers_names.size();
+ create_info.ppEnabledLayerNames = vk_required_layers_names.data();
+
+ VkResult result =
+ vkCreateInstance(&create_info, nullptr, &BluCat::core.vk_instance);
+ if(result != VK_SUCCESS)
+ {
+ std::string error{""};
+ switch(result)
+ {
+ case VK_ERROR_LAYER_NOT_PRESENT:
+ error = " Layer not present.";
+ break;
+ case VK_ERROR_EXTENSION_NOT_PRESENT:
+ error = " Extension not present.";
+ }
+ error = "Failed to create Vulkan instance." + error;
+ throw CommandError{error};
+ }
+ }
+}
+
+void
+unload_vk_instance(void *obj)
+{
+ vkDestroyInstance(BluCat::core.vk_instance, nullptr);
}
void
load_window_surface(void *obj)
{
if(!SDL_Vulkan_CreateSurface(
- cg_core.window, cg_core.vk_instance, &cg_core.window_surface))
+ cg_core.window, BluCat::core.vk_instance, &BluCat::core.window_surface))
{
std::string error{"Failed to create a window surface → "};
error += SDL_GetError();
@@ -417,373 +345,20 @@ load_window_surface(void *obj)
void
unload_window_surface(void *obj)
{
- vkDestroySurfaceKHR(cg_core.vk_instance, cg_core.window_surface, nullptr);
-}
-
-#ifdef DEBUG
-void
-load_blucat_debug_callback(void *obj)
-{
- PFN_vkCreateDebugUtilsMessengerEXT debug_messenger;
-
- // A Vulkan instance extension named VK_EXT_debug_utils and a Vulkan instance
- // layer named VK_LAYER_LUNARG_standard_validation are required to enable
- // this callback. These instance extension and instance layer are loaded at
- // Instance::load_blucat_instance.
- VkDebugUtilsMessengerCreateInfoEXT create_info;
- create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
- create_info.pNext = nullptr;
- create_info.messageSeverity =
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
- create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
- create_info.pfnUserCallback = vk_debug_callback;
- create_info.pUserData = nullptr;
- create_info.flags = 0;
-
- debug_messenger = (PFN_vkCreateDebugUtilsMessengerEXT)
- vkGetInstanceProcAddr(cg_core.vk_instance,
- "vkCreateDebugUtilsMessengerEXT");
-
- if(debug_messenger(cg_core.vk_instance, &create_info, nullptr,
- &cg_core.vk_callback) != VK_SUCCESS)
- CommandError{"Failed to setup debug callback for Vulkan."};
-}
-
-void
-unload_blucat_debug_callback(void *obj)
-{
- PFN_vkDestroyDebugUtilsMessengerEXT debug_messenger;
-
- debug_messenger = (PFN_vkDestroyDebugUtilsMessengerEXT)
- vkGetInstanceProcAddr(cg_core.vk_instance,
- "vkDestroyDebugUtilsMessengerEXT");
-
- debug_messenger(cg_core.vk_instance, cg_core.vk_callback, nullptr);
-}
-#endif
-
-void
-load_blucat_devices(void *obj)
-{
- uint32_t devices_count;
- std::vector<VkPhysicalDevice> vk_physical_devices;
-
- // Enumerate physical devices
- {
- vkEnumeratePhysicalDevices(cg_core.vk_instance, &devices_count, nullptr);
- if(devices_count < 1)
- CommandError{"Failed to find GPUs with Vulkan support."};
- vk_physical_devices.resize(devices_count);
- vkEnumeratePhysicalDevices(
- cg_core.vk_instance, &devices_count, vk_physical_devices.data());
- }
-
-#ifdef DEBUG
- cg_core.log.message(Log::Level::Trace, "Physical devices properties");
-#endif
-
- cg_core.vk_devices.reserve(devices_count);
- for(auto i = 0; i < devices_count; i++)
- {
- // Use swapchain on first device.
- if(i == 0)
- {
- cg_core.vk_devices.emplace_back(vk_physical_devices[i], true);
- cg_core.vk_device_with_swapchain = &cg_core.vk_devices[i];
- }
- else
- cg_core.vk_devices.emplace_back(vk_physical_devices[i], false);
- }
-}
-
-void
-unload_blucat_devices(void *obj)
-{
- cg_core.vk_devices.clear();
-}
-
-static void
-load_blucat_swapchain(void *obj)
-{
- try { cg_core.vk_swapchain = new BluCat::Swapchain(); }
- catch(const CommandError &error)
- {
- std::string error_message{"Failed to create swapchain → "};
- error_message += error.what();
- throw CommandError{error_message};
- }
-}
-
-void
-unload_blucat_swapchain(void *obj)
-{
- delete cg_core.vk_swapchain;
-}
-
-void
-load_blucat_framebuffer(void *obj)
-{
- try
- {
- cg_core.vk_framebuffer = new BluCat::Framebuffer();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create framebuffer."};
- }
-}
-
-void
-unload_blucat_framebuffer(void *obj)
-{
- delete cg_core.vk_framebuffer;
-}
-
-void
-load_blucat_render_pass(void *obj)
-{
- try
- {
- cg_core.vk_render_pass = new BluCat::RenderPass();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create render pass."};
- }
-}
-
-void
-unload_blucat_render_pass(void *obj)
-{
- delete cg_core.vk_render_pass;
-}
-
-void
-load_blucat_descriptor_set_layout(void *obj)
-{
- try
- {
- cg_core.vk_descriptor_set_layout = new BluCat::DescriptorSetLayout();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create descriptor set layouts."};
- }
-}
-
-void
-unload_blucat_descriptor_set_layout(void *obj)
-{
- delete cg_core.vk_descriptor_set_layout;
-}
-
-void
-load_blucat_graphics_pipeline_3d_layout(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_3d_layout =
- new BluCat::GraphicsPipeline3DLayout();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 3d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_3d_layout(void *obj)
-{
- delete cg_core.vk_graphics_pipeline_3d_layout;
-}
-
-void
-load_blucat_graphics_pipeline_2d_solid_layout(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_2d_solid_layout =
- new BluCat::GraphicsPipeline2DSolidLayout();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 2d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_2d_solid_layout(void *obj)
-{
- delete cg_core.vk_graphics_pipeline_2d_solid_layout;
-}
-
-void
-load_blucat_graphics_pipeline_2d_wired_layout(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_2d_wired_layout =
- new BluCat::GraphicsPipeline2DWiredLayout();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 2d graphics pipeline."};
- }
+ vkDestroySurfaceKHR(
+ BluCat::core.vk_instance, BluCat::core.window_surface, nullptr);
}
void
-unload_blucat_graphics_pipeline_2d_wired_layout(void *obj)
+load_blucat(void *obj)
{
- delete cg_core.vk_graphics_pipeline_2d_wired_layout;
+ BluCat::core.loader.execute(nullptr);
}
void
-load_blucat_light(void *obj)
+unload_blucat(void *obj)
{
- try
- {
- cg_core.vk_light = new BluCat::Light();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to descriptor sets for light."};
- }
-}
-
-void
-unload_blucat_light(void *obj)
-{
- delete cg_core.vk_light;
-}
-
-void
-load_blucat_graphics_pipeline_3d(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_3d =
- std::make_unique<BluCat::GraphicsPipeline3D>();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 3d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_3d(void *obj)
-{
- cg_core.vk_graphics_pipeline_3d = nullptr;
-}
-
-void
-load_blucat_graphics_pipeline_3d_skeletal(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_3d_skeletal =
- std::make_unique<BluCat::GraphicsPipeline3DSkeletal>();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 3d skeletal graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_3d_skeletal(void *obj)
-{
- cg_core.vk_graphics_pipeline_3d_skeletal = nullptr;
-}
-
-void
-load_blucat_graphics_pipeline_sprite_3d(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_sprite_3d =
- std::make_unique<BluCat::GraphicsPipelineSprite3D>();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create sprite 3d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_sprite_3d(void *obj)
-{
- cg_core.vk_graphics_pipeline_sprite_3d = nullptr;
-}
-
-void
-load_blucat_graphics_pipeline_2d_solid(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_2d_solid =
- std::make_unique<BluCat::GraphicsPipeline2DSolid>();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 2d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_2d_solid(void *obj)
-{
- cg_core.vk_graphics_pipeline_2d_solid = nullptr;
-}
-
-void
-load_blucat_graphics_pipeline_2d_wired(void *obj)
-{
- try
- {
- cg_core.vk_graphics_pipeline_2d_wired =
- std::make_unique<BluCat::GraphicsPipeline2DWired>();
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create 2d graphics pipeline."};
- }
-}
-
-void
-unload_blucat_graphics_pipeline_2d_wired(void *obj)
-{
- cg_core.vk_graphics_pipeline_2d_wired = nullptr;
-}
-
-void
-load_blucat_renderer(void *obj)
-{
- try
- {
- glm::vec4 region(
- 0.f, 0.f,
- static_cast<float>(cg_core.display_width),
- static_cast<float>(cg_core.display_height));
- cg_core.vk_renderer = new BluCat::Renderer(
- {},
- {std::make_shared<BluCat::View3D>(region, region.z, region.w)});
- }
- catch(const CommandError &e)
- {
- throw CommandError{"Failed to create renderer."};
- }
-}
-
-void
-unload_blucat_renderer(void *obj)
-{
- delete cg_core.vk_renderer;
+ BluCat::core.loader.revert(nullptr);
}
void
@@ -810,41 +385,14 @@ load_mruby_interface(void *obj)
}
const CommandChain cg_sCore::loader{
- {&load_threads, &unload_threads},
{&load_mruby_symbols, nullptr},
{&load_game, nullptr},
{&load_sdl, &unload_sdl},
{&load_sdl_mixer, &unload_sdl_mixer},
{&load_sdl_open_audio, &unload_sdl_open_audio},
{&load_window, &unload_window},
- {&load_font_library, &unload_font_library},
- {&load_blucat_instance, &unload_blucat_instance},
+ {&load_vk_instance, &unload_vk_instance},
{&load_window_surface, &unload_window_surface},
-#ifdef DEBUG
- {&load_blucat_debug_callback, &unload_blucat_debug_callback},
-#endif
- {&load_blucat_devices, &unload_blucat_devices},
- {&load_blucat_swapchain, &unload_blucat_swapchain},
-
- {&load_blucat_render_pass, &unload_blucat_render_pass},
- {&load_blucat_framebuffer, &unload_blucat_framebuffer},
- {&load_blucat_descriptor_set_layout, &unload_blucat_descriptor_set_layout},
- {&load_blucat_graphics_pipeline_3d_layout,
- &unload_blucat_graphics_pipeline_3d_layout},
- {&load_blucat_graphics_pipeline_2d_solid_layout,
- &unload_blucat_graphics_pipeline_2d_solid_layout},
- {&load_blucat_graphics_pipeline_2d_wired_layout,
- &unload_blucat_graphics_pipeline_2d_wired_layout},
- {&load_blucat_light, &unload_blucat_light},
- // TODO: finish skeletal mesh animation
- {&load_blucat_graphics_pipeline_3d_skeletal,
- &unload_blucat_graphics_pipeline_3d_skeletal},
- {&load_blucat_graphics_pipeline_3d, &unload_blucat_graphics_pipeline_3d},
- {&load_blucat_graphics_pipeline_sprite_3d,
- &unload_blucat_graphics_pipeline_sprite_3d},
- {&load_blucat_graphics_pipeline_2d_solid, &unload_blucat_graphics_pipeline_2d_solid},
- {&load_blucat_graphics_pipeline_2d_wired, &unload_blucat_graphics_pipeline_2d_wired},
-
- {&load_blucat_renderer, &unload_blucat_renderer},
+ {&load_blucat, &unload_blucat},
{&load_mruby_interface, nullptr}
};