1#include "system_class.h"
5extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
7system_class::system_class()
12 application_name_ = 0;
15 initial_window_width_ = 0;
16 initial_window_height_ = 0;
17 is_direct_3d_initialized_ =
false;
21system_class::~system_class()
25bool system_class::initialize()
27 int screenHeight, screenWidth = 0;
30 Logger::Get().
Log(
"Initializing system class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
35 initialize_windows(screenWidth, screenHeight);
38 input_ = std::make_shared<input_class>();
40 result = input_->Initialize(hinstance_, hwnd_, screenWidth, screenHeight);
43 Logger::Get().
Log(
"Failed to initialize input class", __FILE__, __LINE__, Logger::LogLevel::Error);
48 application_ = std::make_shared<application_class>();
50 result = application_->initialize(screenWidth, screenHeight, hwnd_,
false);
56 is_direct_3d_initialized_ =
true;
59 if (initial_window_width_ > 0 && initial_window_height_ > 0)
61 application_->get_direct_3d()->resize_swap_chain(initial_window_width_, initial_window_height_);
67 imgui_manager_ = std::make_shared<imguiManager>();
68 imgui_manager_->SetApp(application_);
69 result = imgui_manager_->Initialize(hwnd_, application_->get_direct_3d()->get_device(), application_->get_direct_3d()->get_device_context());
77 catch (
const std::exception& e)
79 Logger::Get().
Log(std::string(
"Exception caught during initialization: ") + e.what(), __FILE__, __LINE__, Logger::LogLevel::Error);
83 Logger::Get().
Log(
"System class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
88void system_class::shutdown()
90 Logger::Get().
Log(
"Shutting down system class", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
92 std::lock_guard<std::mutex> guard(render_mutex_);
97 Logger::Get().
Log(
"System class shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
101void system_class::run()
109 ZeroMemory(&msg,
sizeof(MSG));
117 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
119 if(msg.message == WM_QUIT)
125 TranslateMessage(&msg);
126 DispatchMessage(&msg);
131 if (application_ !=
nullptr && application_->get_should_quit())
133 Logger::Get().
Log(
"Received quit signal from application", __FILE__, __LINE__);
142 Logger::Get().
Log(
"Failed to process frame", __FILE__, __LINE__, Logger::LogLevel::Error);
152bool system_class::frame()
155 application_->get_direct_3d()->begin_scene(0.0f, 0.0f, 0.0f, 1.0f);
157 std::lock_guard<std::mutex> guard(render_mutex_);
160 result = input_->Frame();
163 Logger::Get().
Log(
"Failed to process input frame", __FILE__, __LINE__, Logger::LogLevel::Error);
168 result = application_->frame(input_.get());
171 Logger::Get().
Log(
"Failed to process application frame", __FILE__, __LINE__, Logger::LogLevel::Error);
175 if(!input_->IsKeyDown(222))
178 is_debug_key_pressed_ =
false;
180 else if (input_->IsKeyDown(222) && !is_debug_key_pressed_)
183 is_debug_key_pressed_ =
true;
184 DEBUG_MODE = !DEBUG_MODE;
190 result = imgui_manager_->ImGuiWidgetRenderer();
193 Logger::Get().
Log(
"Failed to render ImGui widgets", __FILE__, __LINE__, Logger::LogLevel::Error);
198 application_->get_direct_3d()->end_scene();
203LRESULT CALLBACK system_class::message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
206 if (ImGui_ImplWin32_WndProcHandler(hwnd, umsg, wparam, lparam))
217 input_->KeyDown((
unsigned int)wparam);
225 input_->KeyUp((
unsigned int)wparam);
230 int newWidth = LOWORD(lparam);
231 int newHeight = HIWORD(lparam);
234 if (is_direct_3d_initialized_ && application_ && application_->get_direct_3d())
236 application_->set_screen_width(newWidth);
237 application_->set_screen_height(newHeight);
238 application_->get_direct_3d()->resize_swap_chain(newWidth, newHeight);
242 initial_window_width_ = newWidth;
243 initial_window_height_ = newHeight;
247 case WM_ENTERSIZEMOVE:
252 case WM_EXITSIZEMOVE:
254 is_resizing_ =
false;
259 HDROP hDrop =
reinterpret_cast<HDROP
>(wparam);
260 UINT numFiles = DragQueryFile(hDrop, 0xFFFFFFFF,
nullptr, 0);
263 for (UINT i = 0; i < numFiles; ++i) {
264 WCHAR filePath[MAX_PATH];
265 DragQueryFile(hDrop, i, filePath, MAX_PATH);
268 std::wstring fileName = filePath;
269 std::wstring extension = fileName.substr(fileName.find_last_of(L
".") + 1);
272 if (extension == L
"txt" || extension == L
"kobj") {
274 std::wcout << L
"File dropped: " << filePath << std::endl;
275 application_->add_kobject(fileName);
279 std::wcout << L
"Ignored file: " << filePath << std::endl;
289 Logger::Get().
Log(
"WM_CLOSE message received", __FILE__, __LINE__);
290 application_->set_should_quit(
true);
296 return DefWindowProc(hwnd, umsg, wparam, lparam);
304void system_class::initialize_windows(
int& screenWidth,
int& screenHeight)
307 DEVMODE dmScreenSettings;
310 Logger::Get().
Log(
"Initializing windows", __FILE__, __LINE__, Logger::LogLevel::Initialize);
312 application_handle =
this;
315 hinstance_ = GetModuleHandle(NULL);
318 application_name_ = L
"Khaotic Engine";
321 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
322 wc.lpfnWndProc = wnd_proc;
325 wc.hInstance = hinstance_;
326 wc.hIcon = LoadIcon(hinstance_,MAKEINTRESOURCE(IDI_ICON1));
327 wc.hIconSm = LoadIcon(hinstance_, MAKEINTRESOURCE(IDI_ICON1));
328 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
329 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
330 wc.lpszMenuName = NULL;
331 wc.lpszClassName = application_name_;
332 wc.cbSize =
sizeof(WNDCLASSEX);
335 RegisterClassEx(&wc);
338 screenWidth = GetSystemMetrics(SM_CXSCREEN);
339 screenHeight = GetSystemMetrics(SM_CYSCREEN);
345 memset(&dmScreenSettings, 0,
sizeof(dmScreenSettings));
346 dmScreenSettings.dmSize =
sizeof(dmScreenSettings);
347 dmScreenSettings.dmPelsWidth = (
unsigned long)screenWidth;
348 dmScreenSettings.dmPelsHeight = (
unsigned long)screenHeight;
349 dmScreenSettings.dmBitsPerPel = 32;
350 dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
353 ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
365 posX = (GetSystemMetrics(SM_CXSCREEN) - screenWidth) / 2;
366 posY = (GetSystemMetrics(SM_CYSCREEN) - screenHeight) / 2;
370 hwnd_ = CreateWindowEx(WS_EX_APPWINDOW, application_name_, application_name_,
371 WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
372 posX, posY, screenWidth, screenHeight, NULL, NULL, hinstance_, NULL);
375 ShowWindow(hwnd_, SW_SHOW);
376 SetForegroundWindow(hwnd_);
383 DragAcceptFiles(hwnd_, TRUE);
388void system_class::shutdown_windows()
390 Logger::Get().
Log(
"Shutting down the windows", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
397 ChangeDisplaySettings(NULL, 0);
401 DestroyWindow(hwnd_);
405 UnregisterClass(application_name_, hinstance_);
409 application_handle = NULL;
414LRESULT CALLBACK wnd_proc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
434 application_handle->message_handler(hwnd, umessage, wparam, lparam);
441 return application_handle->message_handler(hwnd, umessage, wparam, lparam);
446void system_class::send_path(
wchar_t* path, std::filesystem::path w_folder)
448 application_->set_path(path);
449 application_->set_w_folder(w_folder);
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)