diff options
Diffstat (limited to 'src/core.cpp')
-rw-r--r-- | src/core.cpp | 193 |
1 files changed, 125 insertions, 68 deletions
diff --git a/src/core.cpp b/src/core.cpp index 8d828d6..1efaedc 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -16,6 +16,20 @@ #include "core.hpp" +#include "candy_gear.hpp" +#include "graphic.hpp" +#include "key.hpp" +#include "mesh.hpp" +#include "model.hpp" +#include "rotation_3d.hpp" +#include "sound.hpp" +#include "sprite.hpp" +#include "texture.hpp" +#include "vector_3d.hpp" +#include "vector_4d.hpp" +#include "view_2d.hpp" +#include "view_3d.hpp" + #ifdef DEBUG #include <sstream> #endif @@ -25,8 +39,11 @@ std::random_device random_seed; std::mt19937 random_number_generator; +namespace +{ + #ifdef DEBUG -static VKAPI_ATTR VkBool32 VKAPI_CALL +VKAPI_ATTR VkBool32 VKAPI_CALL vk_debug_callback( VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, @@ -51,36 +68,71 @@ vk_debug_callback( } #endif -static void -load_variables(void *obj) +void +load_mruby_symbols(void *obj) +{ + cg_core.sym_config = mrb_intern_cstr(cg_core.mrb, "config"); + cg_core.sym_debug = mrb_intern_cstr(cg_core.mrb, "debug"); + cg_core.sym_error = mrb_intern_cstr(cg_core.mrb, "error"); + cg_core.sym_fatal = mrb_intern_cstr(cg_core.mrb, "fatal"); + cg_core.sym_information = mrb_intern_cstr(cg_core.mrb, "information"); + cg_core.sym_init = mrb_intern_cstr(cg_core.mrb, "init"); + cg_core.sym_key_down = mrb_intern_cstr(cg_core.mrb, "key_down"); + cg_core.sym_key_up = mrb_intern_cstr(cg_core.mrb, "key_up"); + cg_core.sym_quit = mrb_intern_cstr(cg_core.mrb, "quit"); + cg_core.sym_tick = mrb_intern_cstr(cg_core.mrb, "tick"); + cg_core.sym_trace = mrb_intern_cstr(cg_core.mrb, "trace"); + cg_core.sym_warning = mrb_intern_cstr(cg_core.mrb, "warning"); +} + +void +load_game(void *obj) { using namespace std::chrono; - YAML::Node root = YAML::LoadFile(cg_core.config_file); + FILE *fp; + mrb_value main_obj = mrb_obj_iv_inspect(cg_core.mrb, cg_core.mrb->top_self); - std::string game_name = root["name"].as<std::string>().c_str(); - cg_core.game_name = new char[game_name.size() + 1]; - strcpy(cg_core.game_name, game_name.c_str()); + cg_core.game_name = "CandyGear Game"; - cg_core.screen_width = root["screen"]["width"].as<int>(); - cg_core.screen_height = root["screen"]["height"].as<int>(); + cg_core.display_width = 800; + cg_core.display_height = 600; cg_core.game_version_major = 0; cg_core.game_version_minor = 1; cg_core.game_version_patch = 0; cg_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(), "r"); + mrb_load_irep_file(cg_core.mrb, fp); + fclose(fp); + if (cg_core.mrb->exc) + { + mrb_print_error(cg_core.mrb); + throw CommandError{"Error loading game."}; + } + + mrb_funcall_id(cg_core.mrb, main_obj, cg_core.sym_config, 0); + if (cg_core.mrb->exc) + { + mrb_print_error(cg_core.mrb); + throw CommandError{"Error configuring game."}; + } + + 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); } -static void -unload_variables(void *obj) -{ - delete[] cg_core.game_name; -} - -static void +void load_sdl(void *obj) { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) @@ -99,14 +151,14 @@ load_sdl(void *obj) } } -static void +void unload_sdl(void *obj) { SDL_Vulkan_UnloadLibrary(); SDL_Quit(); } -static void +void load_sdl_image(void *obj) { int flags = IMG_INIT_JPG|IMG_INIT_PNG|IMG_INIT_TIF; @@ -118,13 +170,13 @@ load_sdl_image(void *obj) } } -static void +void unload_sdl_image(void *obj) { IMG_Quit(); } -static void +void load_sdl_mixer(void *obj) { int flags = MIX_INIT_OGG|MIX_INIT_MOD; @@ -137,13 +189,13 @@ load_sdl_mixer(void *obj) } } -static void +void unload_sdl_mixer(void *obj) { while(Mix_Init(0)) Mix_Quit(); } -static void +void load_sdl_open_audio(void *obj) { if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 1024) == -1) @@ -154,19 +206,20 @@ load_sdl_open_audio(void *obj) } } -static void +void unload_sdl_open_audio(void *obj) { Mix_CloseAudio(); } -static void +void load_window(void *obj) { cg_core.window = NULL; cg_core.window = SDL_CreateWindow( - cg_core.game_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - cg_core.screen_width, cg_core.screen_height, SDL_WINDOW_VULKAN); + cg_core.game_name.c_str(), SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, cg_core.display_width, cg_core.display_height, + SDL_WINDOW_VULKAN); if(cg_core.window == NULL) { std::string error{"Window could not be created! SDL_Error → "}; @@ -175,13 +228,13 @@ load_window(void *obj) } } -static void +void unload_window(void *obj) { SDL_DestroyWindow(cg_core.window); } -static void +void load_vk_instance(void *obj) { std::vector<const char*> vk_extensions; @@ -279,7 +332,7 @@ load_vk_instance(void *obj) VkApplicationInfo app_info; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.pNext = nullptr; - app_info.pApplicationName = cg_core.game_name; + 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, @@ -320,13 +373,13 @@ load_vk_instance(void *obj) } } -static void +void unload_vk_instance(void *obj) { vkDestroyInstance(cg_core.vk_instance, nullptr); } -static void +void load_window_surface(void *obj) { if(!SDL_Vulkan_CreateSurface( @@ -338,14 +391,14 @@ load_window_surface(void *obj) } } -static void +void unload_window_surface(void *obj) { vkDestroySurfaceKHR(cg_core.vk_instance, cg_core.window_surface, nullptr); } #ifdef DEBUG -static void +void load_vk_debug_callback(void *obj) { PFN_vkCreateDebugUtilsMessengerEXT debug_messenger; @@ -378,7 +431,7 @@ load_vk_debug_callback(void *obj) CommandError{"Failed to setup debug callback for Vulkan."}; } -static void +void unload_vk_debug_callback(void *obj) { PFN_vkDestroyDebugUtilsMessengerEXT debug_messenger; @@ -391,7 +444,7 @@ unload_vk_debug_callback(void *obj) } #endif -static void +void load_vk_devices(void *obj) { uint32_t devices_count; @@ -425,7 +478,7 @@ load_vk_devices(void *obj) } } -static void +void unload_vk_devices(void *obj) { cg_core.vk_devices.clear(); @@ -443,13 +496,13 @@ load_vk_swapchain(void *obj) } } -static void +void unload_vk_swapchain(void *obj) { delete cg_core.vk_swapchain; } -static void +void load_vk_graphics_pipeline_3d_layout(void *obj) { try @@ -463,13 +516,13 @@ load_vk_graphics_pipeline_3d_layout(void *obj) } } -static void +void unload_vk_graphics_pipeline_3d_layout(void *obj) { delete cg_core.vk_graphics_pipeline_3d_layout; } -static void +void load_vk_graphics_pipeline_2d_layout(void *obj) { try @@ -483,7 +536,7 @@ load_vk_graphics_pipeline_2d_layout(void *obj) } } -static void +void unload_vk_graphics_pipeline_2d_layout(void *obj) { delete cg_core.vk_graphics_pipeline_2d_layout; @@ -529,15 +582,15 @@ unload_vk_graphics_pipeline_2d(void *obj) cg_core.vk_graphics_pipeline_2d = nullptr; } -static void +void load_vk_renderer(void *obj) { try { glm::vec4 region( 0.f, 0.f, - static_cast<float>(cg_core.screen_width), - static_cast<float>(cg_core.screen_height)); + static_cast<float>(cg_core.display_width), + static_cast<float>(cg_core.display_height)); cg_core.vk_renderer = new VK::Renderer( {}, {std::make_shared<VK::View3D>(region)}); @@ -548,38 +601,43 @@ load_vk_renderer(void *obj) } } -static void +void unload_vk_renderer(void *obj) { delete cg_core.vk_renderer; } -static void -load_mruby(void *obj) -{ - cg_core.mrb = mrb_open(); - if (!cg_core.mrb) throw CommandError{"Failed to initialize mruby."}; -} - -static void -unload_mruby(void *obj) -{ - mrb_close(cg_core.mrb); +void +load_mruby_interface(void *obj) +{ + mrb_value main_obj = mrb_obj_iv_inspect(cg_core.mrb, cg_core.mrb->top_self); + + cg_candy_gear_init(cg_core.mrb); + cg_key_init(cg_core.mrb); + cg_mesh_init(cg_core.mrb); + cg_model_init(cg_core.mrb); + cg_rotation_3d_init(cg_core.mrb); + cg_sound_init(cg_core.mrb); + cg_sprite_init(cg_core.mrb); + cg_texture_init(cg_core.mrb); + cg_vector_3d_init(cg_core.mrb); + cg_vector_4d_init(cg_core.mrb); + cg_view_2d_init(cg_core.mrb); + cg_view_3d_init(cg_core.mrb); + + mrb_funcall_id(cg_core.mrb, main_obj, cg_core.sym_init, 0); + if (cg_core.mrb->exc) + { + mrb_print_error(cg_core.mrb); + throw CommandError{"Error initializing game."}; + } } -static void -load_mruby_symbols(void *obj) -{ - cg_core.sym_fatal = mrb_intern_cstr(cg_core.mrb, "fatal"); - cg_core.sym_error = mrb_intern_cstr(cg_core.mrb, "error"); - cg_core.sym_warning = mrb_intern_cstr(cg_core.mrb, "warning"); - cg_core.sym_information = mrb_intern_cstr(cg_core.mrb, "information"); - cg_core.sym_debug = mrb_intern_cstr(cg_core.mrb, "debug"); - cg_core.sym_trace = mrb_intern_cstr(cg_core.mrb, "trace"); } const CommandChain cg_sCore::loader{ - {&load_variables, &unload_variables}, + {&load_mruby_symbols, nullptr}, + {&load_game, nullptr}, {&load_sdl, &unload_sdl}, {&load_sdl_image, &unload_sdl_image}, {&load_sdl_mixer, &unload_sdl_mixer}, @@ -601,6 +659,5 @@ const CommandChain cg_sCore::loader{ {&load_vk_graphics_pipeline_2d, &unload_vk_graphics_pipeline_2d}, {&load_vk_renderer, &unload_vk_renderer}, - {&load_mruby, &unload_mruby}, - {&load_mruby_symbols, nullptr} + {&load_mruby_interface, nullptr} }; |