diff --git a/Data/resources/textures/.kp3d/banner.png b/Data/resources/textures/.kp3d/banner.png
new file mode 100644
index 0000000..970cf7c
Binary files /dev/null and b/Data/resources/textures/.kp3d/banner.png differ
diff --git a/Data/sandbox-log.txt b/Data/sandbox-log.txt
index 81920e6..07ebbbe 100644
--- a/Data/sandbox-log.txt
+++ b/Data/sandbox-log.txt
@@ -1,504 +1,85 @@
-[07:25:25 PM] Info: Starting...
+[02:17:44 AM] Info: Starting...
KP3D version 2
===============================
Copyright (C) kpworld.xyz 2018-2024
Contact me! @kp_cftsz
-[07:25:25 PM] Info: Initializing SDL
-[07:25:26 PM] Info: Initializing OpenGL
-[07:25:26 PM] Info: OpenGL version: 4.6.0 NVIDIA 536.23
-[07:25:26 PM] Info: Initializing GLEW
-[07:25:26 PM] Info: Initializing SDL_mixer
-[07:25:26 PM] Info: Reticulating splines...
-[07:25:26 PM] Info: Ready!
-[07:25:26 PM] Info: Finalized mesh with 45 batches
-[07:25:31 PM] Info: Finalized mesh with 50 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:33 PM] Info: Finalized mesh with 51 batches
-[07:25:35 PM] Info: Finalized mesh with 57 batches
-[07:25:38 PM] Info: Finalized mesh with 59 batches
-[07:25:40 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:40 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:40 PM] Info: Finalized mesh with 61 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:42 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:42 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 65 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:43 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:43 PM] Info: Finalized mesh with 68 batches
-[07:25:44 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Info: Finalized mesh with 68 batches
-[07:25:44 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Info: Finalized mesh with 68 batches
-[07:25:44 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Info: Finalized mesh with 68 batches
-[07:25:44 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:44 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:45 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:45 PM] Info: Finalized mesh with 68 batches
-[07:25:56 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:56 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:56 PM] Info: Finalized mesh with 70 batches
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:56 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:57 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:58 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:59 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:25:59 PM] Info: Finalized mesh with 72 batches
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:25:59 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Error: Bad any cast: Bad any_cast
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:00 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:00 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 76 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:01 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:01 PM] Info: Finalized mesh with 80 batches
-[07:26:02 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Info: Finalized mesh with 80 batches
-[07:26:02 PM] Warning: Sector 12 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Warning: Sector 9 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Warning: Sector 10 error; a sector may not overlap another sector unless all of its walls fit inside
-[07:26:02 PM] Info: Finalized mesh with 80 batches
+[02:17:44 AM] Info: Initializing SDL
+[02:17:44 AM] Info: Initializing OpenGL
+[02:17:44 AM] Info: OpenGL version: 4.6.0 NVIDIA 536.23
+[02:17:44 AM] Info: Initializing GLEW
+[02:17:44 AM] Info: Initializing SDL_mixer
+[02:17:44 AM] Info: Reticulating splines...
+[02:17:45 AM] Info: Ready!
+[02:17:45 AM] Info: Finalized mesh with 45 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:53 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:54 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:58 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:17:59 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info: Finalized mesh with 44 batches
+[02:18:00 AM] Info
\ No newline at end of file
diff --git a/KP3Dii/KP3Dii.vcxproj b/KP3Dii/KP3Dii.vcxproj
index e05954e..ab4f352 100644
--- a/KP3Dii/KP3Dii.vcxproj
+++ b/KP3Dii/KP3Dii.vcxproj
@@ -149,6 +149,7 @@
+
@@ -160,6 +161,7 @@
+
@@ -202,6 +204,7 @@
+
@@ -211,6 +214,7 @@
+
diff --git a/KP3Dii/KP3Dii.vcxproj.filters b/KP3Dii/KP3Dii.vcxproj.filters
index 62374ac..4e93f3c 100644
--- a/KP3Dii/KP3Dii.vcxproj.filters
+++ b/KP3Dii/KP3Dii.vcxproj.filters
@@ -41,6 +41,8 @@
+
+
@@ -95,6 +97,8 @@
+
+
diff --git a/KP3Dii/src/KP3D_Game.cpp b/KP3Dii/src/KP3D_Game.cpp
index 2941cf3..748d746 100644
--- a/KP3Dii/src/KP3D_Game.cpp
+++ b/KP3Dii/src/KP3D_Game.cpp
@@ -204,10 +204,10 @@ Game::Game(std::string path, std::string cfg_path, std::string log_path):
ImGui::GetIO().IniFilename = NULL;
ImFontConfig font_cfg;
// Uncomment for non-anti-aliased fonts:
- // font_cfg.FontBuilderFlags = ImGuiFreeTypeBuilderFlags_Bitmap;
- font_cfg.FontBuilderFlags = ImGuiFreeTypeBuilderFlags_ForceAutoHint;
+ font_cfg.FontBuilderFlags = ImGuiFreeTypeBuilderFlags_Bitmap;
+ font_cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_ForceAutoHint;
font_cfg.FontNo = 2;
- ImGui::GetIO().Fonts->AddFontFromFileTTF((sys::GetFontDir() + ".kp3d/msgothic.ttc").c_str(), 16.0f, &font_cfg);
+ ImGui::GetIO().Fonts->AddFontFromFileTTF((sys::GetFontDir() + ".kp3d/msgothic.ttc").c_str(), 13.0f, &font_cfg);
font_cfg.FontNo = 0;
ImGui::GetIO().Fonts->AddFontFromFileTTF((sys::GetFontDir() + ".kp3d/msgothic.ttc").c_str(), 13.0f, &font_cfg);
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
diff --git a/KP3Dii/src/KP3D_Material.cpp b/KP3Dii/src/KP3D_Material.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/KP3Dii/src/KP3D_Material.h b/KP3Dii/src/KP3D_Material.h
new file mode 100644
index 0000000..cddc394
--- /dev/null
+++ b/KP3Dii/src/KP3D_Material.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "KP3D_Common.h"
+#include "KP3D_Texture.h"
+
+namespace kp3d {
+
+enum MaterialTextureIndex
+{
+ MAT_TEX_DIFFUSE,
+ MAT_TEX_NORMAL,
+ NUM_MAT_TEX
+};
+
+struct Material
+{
+ Texture textures[NUM_MAT_TEX];
+};
+
+} // namespace kp3d
diff --git a/KP3Dii/src/KP3D_Resources.cpp b/KP3Dii/src/KP3D_Resources.cpp
new file mode 100644
index 0000000..d70dc56
--- /dev/null
+++ b/KP3Dii/src/KP3D_Resources.cpp
@@ -0,0 +1,41 @@
+#include "KP3D_Resources.h"
+
+#include
+#include
+
+#include "KP3D_StringUtils.h"
+#include "KP3D_SystemUtils.h"
+
+namespace kp3d::res {
+
+void LoadMaterials()
+{
+ texture_cache.clear();
+
+ // Load every available texture
+ for (const auto& entry: std::filesystem::recursive_directory_iterator(kp3d::sys::GetTextureDir()))
+ {
+ if (entry.is_directory())
+ continue;
+
+ std::filesystem::path entry_path = entry.path();
+ std::string path_str = entry_path.string();
+
+ if (!kp3d::str::EndsWith(path_str, ".png") && !kp3d::str::EndsWith(path_str, ".jpg"))
+ continue;
+
+ std::string filename = std::filesystem::proximate(path_str, kp3d::sys::GetTextureDir()).string();
+ std::replace(filename.begin(), filename.end(), '\\', '/');
+
+ // texture_cache.emplace(filename, );
+
+ // new:
+ // m_loaded_res_mutex.lock();
+ // m_raw_texture_data.push_back(new kp3d::RawTexture(filename));
+ // kp3d::EventBus::GetInstance().PublishDeferred(new kp3d::TextureLoadEvent(filename, m_raw_texture_data.size() - 1));
+ // m_num_loaded++;
+ // m_loaded_res_mutex.unlock();
+ }
+}
+
+} // namespace kp3d::res
diff --git a/KP3Dii/src/KP3D_Resources.h b/KP3Dii/src/KP3D_Resources.h
new file mode 100644
index 0000000..9bfc53d
--- /dev/null
+++ b/KP3Dii/src/KP3D_Resources.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include
+#include
+
+#include "KP3D_Common.h"
+#include "KP3D_Texture.h"
+#include "KP3D_Material.h"
+
+namespace kp3d::res {
+
+std::unordered_map texture_cache;
+
+void LoadMaterials();
+
+} // namespace kp3d::res
diff --git a/Sandbox/src/Editor.cpp b/Sandbox/src/Editor.cpp
index 6da6bb5..56da3e6 100644
--- a/Sandbox/src/Editor.cpp
+++ b/Sandbox/src/Editor.cpp
@@ -31,6 +31,7 @@ inline float Distance(kp3d::Vec3 a, kp3d::Vec3 b)
Editor::Editor()
{
+ m_banner.Load(".kp3d/banner.png");
m_stem.Load("editor/stem.png");
m_block.Load("block.png", true);
m_mode = MODE_BUILD;
@@ -260,45 +261,72 @@ void Editor::RenderUI()
if (ImGui::BeginMenu("View"))
{
ImGui::Checkbox("Info overlay", &show_info_overlay);
+ ImGui::Checkbox("Selection information", &show_selection_info);
ImGui::Checkbox("Console", &kp3d::console::open);
ImGui::EndMenu();
}
+ if (ImGui::BeginMenu("Help"))
+ {
+ ImGui::Checkbox("About KP3Dii", &show_about_view);
+ ImGui::EndMenu();
+ }
ImGui::EndMainMenuBar();
// Overlay
RenderUIInfo();
+ RenderUIAbout();
// Sector window
// ImGui::SetNextWindowSize({400, 500}, ImGuiCond_FirstUseEver);
- ImGui::SetNextWindowPos({20, 200});
- if (ImGui::Begin("Selection Information", nullptr, ImGuiWindowFlags_AlwaysAutoResize))
+ ImGui::SetNextWindowPos({20, 200}, ImGuiCond_FirstUseEver);
+ if (show_selection_info)
{
- if (kp3d::editor_hovered_batch)
+ if (ImGui::Begin("Selection Information", &show_selection_info, ImGuiWindowFlags_AlwaysAutoResize))
{
- try {
- const auto& info = std::any_cast(kp3d::editor_hovered_batch->userdata);
- if (info.sector)
- {
- ImGui::SeparatorText("Hierarchy");
- ImGui::Text("ID: %u\n", info.sector->id);
- ImGui::Text("Parent ID: %u %s\n", info.sector->parent_id, info.sector->parent_id == 0 ? "(N/A)" : "");
- ImGui::Text("Children (%u):\n", info.sector->children.size());
- ImGui::Indent();
- for (const auto& sc : info.sector->children)
- ImGui::Text("- ID: %u", sc->id);
- ImGui::Unindent();
- ImGui::SeparatorText("Properties");
- ImGui::InputFloat("Floor height", &info.sector->floor.base_height);
- ImGui::InputFloat("Ceiling height", &info.sector->ceiling.base_height);
- ImGui::Checkbox("Inverted", &info.sector->inverted);
- }
- } catch (std::bad_any_cast& e) {
- KP3D_LOG_ERROR("Bad any cast: {}", e.what());
+ if (m_mode == MODE_BUILD)
+ {
+ ImGui::Text("No selection");
+ }
+ else if (m_mode == MODE_NORMAL)
+ {
+ if (kp3d::editor_hovered_batch)
+ {
+ try
+ {
+ const auto& info = std::any_cast(kp3d::editor_hovered_batch->userdata);
+ if (info.sector)
+ {
+ ImGui::SeparatorText("Hierarchy");
+ ImGui::Text("ID: %u\n", info.sector->id);
+ ImGui::Text("Parent ID: %u %s\n", info.sector->parent_id, info.sector->parent_id == 0 ? "(N/A)" : "");
+ ImGui::Text("Children (%u):\n", info.sector->children.size());
+ ImGui::Indent();
+ for (const auto& sc : info.sector->children)
+ ImGui::Text("- ID: %u", sc->id);
+ ImGui::Unindent();
+ ImGui::SeparatorText("Properties");
+ ImGui::InputFloat("Floor height", &info.sector->floor.base_height);
+ ImGui::InputFloat("Ceiling height", &info.sector->ceiling.base_height);
+ ImGui::Checkbox("Inverted", &info.sector->inverted);
+ ImGui::SeparatorText("Materials");
+ ImGui::Text("Floor:");
+ ImGui::ImageButton((ImTextureID) info.sector->floor.texture->GetGLID(), {128, 128});
+ ImGui::Text("Ceiling:");
+ ImGui::ImageButton((ImTextureID)info.sector->ceiling.texture->GetGLID(), { 128, 128 });
+ }
+ }
+ catch (std::bad_any_cast& e)
+ {
+ KP3D_LOG_ERROR("Bad any cast: {}", e.what());
+ }
+ }
}
- }
- ImGui::End();
+ ImGui::End();
+ }
}
+
+ //ImGui::ShowDemoWindow();
}
void Editor::RenderUIInfo()
@@ -332,6 +360,26 @@ void Editor::RenderUIInfo()
}
}
+void Editor::RenderUIAbout()
+{
+ if (!show_about_view)
+ return;
+
+ if (ImGui::Begin("About KP3Dii", &show_about_view, ImGuiWindowFlags_AlwaysAutoResize))
+ {
+ ImGui::Image((ImTextureID)m_banner.GetGLID(), {500.0f, 200.0f});
+ ImGui::Separator();
+ ImGui::Text("The swaggiest game engine ever made, you dig?");
+ ImGui::Text("This map editor needs work. Consider it an ad-hoc release until\nI get time to put something nicer together.");
+ ImGui::Text(fmt::format("\nVersion {:.{}f} {}", KP3D_VERSION, 1, KP3D_VERSION <= 2.1 ? "(in-dev dist.)" : "").c_str());
+ ImGui::Text("https://www.kpworld.xyz/");
+ ImGui::Separator();
+ ImGui::Text("Copyright (C) kpworld.xyz 2018-2024");
+
+ ImGui::End();
+ }
+}
+
void Editor::OnScrollWheel(const kp3d::ScrollWheelEvent* e)
{
using namespace kp3d;
diff --git a/Sandbox/src/Editor.h b/Sandbox/src/Editor.h
index ca90602..933b096 100644
--- a/Sandbox/src/Editor.h
+++ b/Sandbox/src/Editor.h
@@ -29,6 +29,7 @@ public:
void RenderUI();
void RenderUIInfo();
+ void RenderUIAbout();
void OnScrollWheel(const kp3d::ScrollWheelEvent* e);
void OnKeyPress(const kp3d::KeyPressEvent* e);
@@ -37,6 +38,7 @@ private:
void RenderLine(kp3d::Vec3 start, kp3d::Vec3 end, kp3d::uint color);
private:
+ kp3d::Texture m_banner;
kp3d::Texture m_stem;
kp3d::Texture m_block;
kp3d::Vec3 m_stem_pos;
@@ -44,6 +46,7 @@ private:
// TODO: Refactor me!
bool show_info_overlay = true;
-
+ bool show_selection_info = false;
+ bool show_about_view = false;
};