{"id":22510991,"url":"https://github.com/FrodoAlaska/Nikola","last_synced_at":"2025-08-03T14:32:10.581Z","repository":{"id":266313022,"uuid":"893261449","full_name":"FrodoAlaska/NikolCore","owner":"FrodoAlaska","description":"A cross-platform framework for window creation, input handling, and rendering using OpenGL or DirectX11","archived":false,"fork":false,"pushed_at":"2024-12-03T16:02:58.000Z","size":483,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-03T17:19:53.605Z","etag":null,"topics":["d3d11","directx-11","directx11","game-development","game-engine","game-engine-development","game-engine-framework","glfw","graphics-programming","opengl","opengl4"],"latest_commit_sha":null,"homepage":"https://frodoalaska.github.io/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FrodoAlaska.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-24T00:26:25.000Z","updated_at":"2024-12-03T16:08:05.000Z","dependencies_parsed_at":"2024-12-03T17:19:57.545Z","dependency_job_id":null,"html_url":"https://github.com/FrodoAlaska/NikolCore","commit_stats":null,"previous_names":["frodoalaska/nikolcore"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrodoAlaska%2FNikolCore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrodoAlaska%2FNikolCore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrodoAlaska%2FNikolCore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrodoAlaska%2FNikolCore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FrodoAlaska","download_url":"https://codeload.github.com/FrodoAlaska/NikolCore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228548594,"owners_count":17935225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["d3d11","directx-11","directx11","game-development","game-engine","game-engine-development","game-engine-framework","glfw","graphics-programming","opengl","opengl4"],"created_at":"2024-12-07T02:07:40.833Z","updated_at":"2025-08-03T14:32:10.432Z","avatar_url":"https://github.com/FrodoAlaska.png","language":"C++","readme":"# *Nikola*\n\nNikola is a cross-platform framework for window creation, input handling, audio playback, and rendering using OpenGL 4.5+, designed for your game development and prototyping needs. Inspired by classic game engines like Doom, Quake, and the Source Engine, it is lightweight yet robust and flexible. A game engine creation tool, if you will.\n\n\n![screenshot](https://github.com/FrodoAlaska/Nikola/blob/master/assets/screenshot_0.png) \n\n\n## Dependencies\n\n### Engine Dependencies:\n- [GLFW](https://github.com/glfw/glfw)\n- [GLAD](https://github.com/Dav1dde/glad)\n- [GLM](https://github.com/g-truc/glm)\n- [ImGui](https://github.com/ocornut/imgui)\n- [OpenAL-Soft](https://github.com/kcat/openal-soft)\n- [Qu3e](https://github.com/RandyGaul/qu3e)\n\n### NBR Tool Dependencies:\n- [stb](https://github.com/nothings/stb)\n- [Assimp](https://github.com/assimp/assimp)\n- [dr_libs](https://github.com/mackron/dr_libs)\n\n## Features  \n- A fully documented, single-header implementation for each library module.  \n- Cross-platform window creation with OpenGL 4.5+.  \n- Gamepad, keyboard, and mouse input support.  \n- A flexible, configurable rendering API.  \n- A simple resource manager with a custom resource format (**NBR**) that supports hot-reloading of resources.  \n- Support for multiple image formats including **JPEG, PNG, BMP, TGA, and more**.  \n- 3D model loading with support for **OBJ, FBX, and GLTF** formats.  \n- Integrated ImGui support, featuring an abstracted `editor` layer for editing engine-specific types through a GUI.  \n- A versitile lighting system using the Blinn-Phong shading model with built-in HDR support.\n- A fully-fledged audio system with both 2D audio and 3D spatialized audio, supporting multiple formats such as **MP3, WAV, and OGG**.\n- A simple but powerful physics system that supports collision detection, collision resolution, ray-casting, and rigid body dynamics.\n\n## Missing Features\n\nSome missing features are not currently in the works (Long-term) while others are planned for the future (Short-term). Some other features may _never_ be implemented since it does not fit the current philosophy of the engine (Never).\n\n- 3D animations (*Long-term*)\n- Scripting (*Never*)\n\n## Build Instructions\n\nBefore proceeding with any build or compilation step, *Nikola* needs to be cloned from the Git repo. \n\n```bash\ngit clone https://github.com/FrodoAlaska/Nikola.git\n```\n\nAnd now that *Nikola* is cloned, we can start the build process. \n\nThere are two main ways to build *Nikola*. The first is to use the traditional _CMake_ commands below:\n\n```bash\nmkdir build \ncd build \ncmake .. \n```\nAnd then to build *Nikola* you can use:\n\n```bash\ncmake --build .\n```\n\nNow the second way to build *Nikola* is to use the build scripts found in the `scripts` directory. There are a few build scripts but there are only two important ones: `build-nikola.sh` for Linux and `build-nikola.ps1` for Windows. Each script takes in a few flags to make both the development and build process easier. \n\n```\n   --clean          = Have a new fresh build              \n   --debug          = Build for the debug configuration   \n   --rel            = Build for the release configuration \n   --jobs [threads] = Threads to use when building        \n   --run-testbed    = Run the testbed examples            \n   --reload-res     = Reload the resources cache          \n   --help           = Display this help message           \n```\n\nThe `--run-testbed` and `--reload-res` flags call other scripts in the same directory. Hence, the multiple shell scripts. But, generally, the `build-nikola.*` script is _the_ main and most important build script.\n\nThe `--debug` and `--rel` _must_ be used independently. Moreover, one of the flags _have_ to be used to know which configuration to build for. If none of them are used, the script will default to a _Debug_ build. Depending on which flag is passed to the build script, a `build-debug` and/or `build-release` will be created in the main directory. Any build artifacts generated by `--run-testbed` or `--reload-res` will be dumped into one of the previously mentioned directories. \n\nThe `--reload-res` flag will call the `reload-resources.*` script to convert any resources to the `.nbr` engine format for resources. However, the `reload-resources.*` in particular is _very_ specific to the current development environment. You can use your own paths and specific resources in the script or use the `NBR` tool directly. \n\n\n# Hello, *Nikola*\nHere's a simple example of the _core_ library working in action. The example below will open a basic window and initialze a graphics context.\n\n```c++\n#include \u003cnikola/nikola.h\u003e\n\nint main() {\n  // Initialze the library\n  if(!nikola::init()) {\n    return -1;\n  }\n\n  // Openinig the window\n  nikola::i32 win_flags = nikola::WINDOW_FLAGS_FOCUS_ON_CREATE | nikola::WINDOW_FLAGS_GFX_HARDWARE;\n  nikola::Window* window = nikola::window_open(\"Hello, Nikola\", 1366, 768, win_flags);\n  if(!window) {\n    return -1;\n  }\n\n  // Creating a graphics context\n  nikola::GfxContextDesc gfx_desc = {\n    .window = window,\n    .states = nikola::GFX_STATE_DEPTH | nikola::GFX_STATE_STENCIL,\n  };\n  nikola::GfxContext* gfx = nikola::gfx_context_init(gfx_desc);\n  if(!gfx) {\n    return -1;\n  }\n\n  // Main loop\n  while(nikola::window_is_open(window)) {\n    // Will stop the application when F1 is pressed\n    if(nikola::input_key_pressed(nikola::KEY_F1)) {\n      break;\n    }\n    \n    // Clear the screen to black\n    nikola::gfx_context_clear(gfx, 0.0f, 0.0f, 0.0f, 1.0f);\n    \n    // Swap the internal window buffer\n    nikola::gfx_context_present(gfx);\n    \n    // Poll the window events\n    nikola::window_poll_events(window);\n  }\n\n  // De-initialze\n  nikola::gfx_context_shutdown(gfx);\n  nikola::window_close(window);\n  nikola::shutdown();\n}\n\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFrodoAlaska%2FNikola","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FFrodoAlaska%2FNikola","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFrodoAlaska%2FNikola/lists"}