summaryrefslogtreecommitdiff
path: root/src/core.cpp
diff options
context:
space:
mode:
authorFrederico Linhares <fred@linhares.blue>2022-10-10 16:13:12 -0300
committerFrederico Linhares <fred@linhares.blue>2022-10-10 16:15:09 -0300
commit9d6d723846d737b0bcc6b51afefcf313f723dcd0 (patch)
treed4b6ea5556fc9c56e28ea01ffe8375bee0a464bb /src/core.cpp
parent63d7d305da643ec20fed3cdd60c4daec29272c41 (diff)
feat Move configuration from YAML file to game
Diffstat (limited to 'src/core.cpp')
-rw-r--r--src/core.cpp193
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}
};