{"id":18435785,"url":"https://github.com/miguelibero/darmok","last_synced_at":"2026-03-15T02:17:44.434Z","repository":{"id":209073835,"uuid":"722709699","full_name":"miguelibero/darmok","owner":"miguelibero","description":"another C++ game engine","archived":false,"fork":false,"pushed_at":"2024-10-25T09:58:05.000Z","size":35097,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-25T10:49:04.144Z","etag":null,"topics":["bgfx","directx","entity-component-system","entt","lua","opengl","videogames","vulkan"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/miguelibero.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","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":"2023-11-23T18:55:26.000Z","updated_at":"2024-10-25T09:58:09.000Z","dependencies_parsed_at":"2024-07-16T03:45:44.242Z","dependency_job_id":"accf6b39-adc1-4eb8-a503-65543eb17a24","html_url":"https://github.com/miguelibero/darmok","commit_stats":null,"previous_names":["miguelibero/darmok"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelibero%2Fdarmok","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelibero%2Fdarmok/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelibero%2Fdarmok/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miguelibero%2Fdarmok/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/miguelibero","download_url":"https://codeload.github.com/miguelibero/darmok/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247725485,"owners_count":20985709,"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":["bgfx","directx","entity-component-system","entt","lua","opengl","videogames","vulkan"],"created_at":"2024-11-06T06:09:19.537Z","updated_at":"2026-03-15T02:17:44.396Z","avatar_url":"https://github.com/miguelibero.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"darmok\n====\n\n![Dathon trying to explain the importance of Darmok](logo.png)\n\nC++ game engine combining opensource libraries \u0026 tools that I like\n\ncurrently using:\n\n* [bgfx](https://github.com/bkaradzic/bgfx) as the renderer\n* [CMake](https://cmake.org/) as the build system \n* [vcpkg](https://vcpkg.io) as the package manager\n* [glm](https://github.com/g-truc/glm) for 3d math\n* [EnTT](https://github.com/skypjack/entt) as the entity component system\n* [assimp](https://github.com/assimp/assimp) for generic asset loading (not in runtime)\n* [sol2](https://github.com/ThePhD/sol2) modern C++ bindings for lua\n* [nlohmann-json](https://github.com/nlohmann/json) for parsing json\n* [pugixml](https://pugixml.org/) for parsing xml\n* [imgui](https://github.com/ocornut/imgui) for editor UI\n* [RmlUI](https://github.com/mikke89/RmlUi) for ingame UI\n* [ozz](https://github.com/guillaumeblanc/ozz-animation/) for 3d skeletal animations\n* [protocol buffers](https://protobuf.dev/getting-started/cpptutorial/) for serialization\n* [Jolt](https://github.com/jrouwe/JoltPhysics) for 3D physics\n* [miniaudio](https://miniaud.io/) for audio\n* [taskflow](https://github.com/taskflow/taskflow) for multithreading\n* [tiny-process-lib](https://gitlab.com/eidheim/tiny-process-library) to run os processes\n* [mikktspace](http://www.mikktspace.com/) - to calculate tangents\n* [middleclass](https://github.com/kikito/middleclass) - small object orientation lua lib\n* [cli11](https://github.com/CLIUtils/CLI11) - command line parser\n* [tinyfiledialogs](https://sourceforge.net/projects/tinyfiledialogs/) - native file dialogs\n* [tl-expected](https://github.com/TartanLlama/expected) - expected for C++20\n* [magic_enum](https://github.com/Neargye/magic_enum) automatically convert enum types\n* [fmt](https://github.com/fmtlib/fmt) for string formatting\n* [utfcpp](https://github.com/nemtrif/utfcpp) for unicode string encoding\n\nplanned to use:\n* [slang](https://github.com/shader-slang/slang) unified shader language that compiles to  the different render\n* [recast navigation](http://recastnav.com/) for pathfinding\n* [BehaviorTree.CPP](https://www.behaviortree.dev/) for behavior trees\n* [Box2D](https://box2d.org/) 2D physics\n* [ldtk](https://ldtk.io/) for 2D level editor\n* [spine](https://github.com/EsotericSoftware/spine-runtimes) for 2d skeletal animations\n backends\n\nTrying to target the following platforms:\n* desktop (windows, macos, linux)\n* mobile (iOS, Android) (pending)\n\nSome philosofical decisions (could be controversial)\n* use modern C++ (20) patterns where possible\n* use as much stl as possible (need to look into memory management at some point)\n* no naked pointers\n* return `expected` for error handling (everything noexcept if possible)\n* try to keep the API similar to Unity3D (where it makes sense) so that it's easy to port game logic\n\n**WARNING**: currently in early stages of development\n\n![editor screenshot](editor_screenshot.png)\n\n## Frequently Asked Questions\n\n* Will it have feature X?\n\u003e Depends on what I need. Anyone is welcome to fork and submit PRs.\n\n## Current State\n\nI'm still learning CMake, so if you see something that should be fixed please let me know.\n\n### Working features\n\n* bgfx window setup (GLFW on windows \u0026 linux)\n* update logic methods with delta time\n* renderer\n    * point, spot, directional \u0026 ambient lights\n    * forward render\n        * unlit, gui\n        * basic phong\n        * PBR metallic-roughness\n    * cascaded shadow mapping\n        * ambient, directional, spot \u0026 point light shadows\n    * camera culling (frustum, occlusion seems to be broken)\n* asset system\n    * sprites and spritesheets\n    * loading models using assimp (FBX, gltf, etc...)\n    * serializing assets into protocol buffers\n* entity component scene using entt\n    * transform, camera\n    * type filtering\n    * serialization using protocol buffers\n    * lights\n    * free look\n* lua scripting\n    * coroutines with API similar to unity\n    * lua script entity component (similar to Unity MonoBehavior)\n* multiple UI options\n    * imgui for tooling\n    * RmlUI for ingame (support for multiple canvases)\n* skeletal animations using ozz (reading from binary)\n* 3d physics using jolt\n    * rigidbodies\n    * character controller\n* command-line tools to export assets\n    * shaders \u0026 vertex layouts\n    * copy files\n    * assimp scenes\n    * ozz skeleton \u0026 animations\n* dynamic font texture generation\n* play sounds and music (wav \u0026 mp3)\n* editor using imgui\n\n#### Upcoming\n* slang support\n* move main thread to taskflow\n* frame limiting\n* more renderer features\n    * bloom\n    * deferred, clustered\n    * SSAO\n* text improvements\n    * finish all the TextRenderConfig options\n    * dynamic distance field rendering with border support\n* asset loading progress (maybe implement progressive loading)\n* possible refactors\n    * maybe replace Data for std::vector\u003cuint8_t\u003e and DataView for std::span\u003cuint8_t\u003e\n    * OptionalRef should be std::optional\u003cT\u0026\u003e\n    * move lua bindings to separate library?\n\n#### In the future\n* run clang-tidy\n* fix occlusion culling\n* switch from exceptions to std::expected\n* more unit tests\n* performance profiling\n* prefabs\n* 2d physics\n* instancing\n* 3d physics materials\n* baked shadowmaps\n* multithreaded updates ([Ubisoft](https://www.youtube.com/watch?v=X1T3IQ4N-3g))\n* custom UI module (rmlui is nice but slow)\n* spine animations\n* unify use of allocators everywhere\n* progressive asset loaders\n* lua debugging\n* particle systems (maybe effekseer)\n* more sound options (spatialization, effects)\n* animation root motion \n* [openusd](https://github.com/PixarAnimationStudios/OpenUSD) scene format support\n* async/await style wrapper for taskflow\n\n## Interesting Related Projects\n* [SuperNovaEngine](https://github.com/skaarj1989/SupernovaEngine) a very similar engine but much more advanced\n* [Cluster](https://github.com/pezcode/Cluster) - PBR shaders for bgfx\n* [dome engine](https://github.com/domeengine/dome) - minimalist engine with wren as the scripting language\n* [RaZ engine](https://github.com/Razakhel/RaZ) - C++17 game engine\n* [meshoptimizer](https://github.com/zeux/meshoptimizer)\n* [forward+](https://www.3dgep.com/forward-plus/) - description of tiled forward renderer in DirectX 11\n\n## Example code\n\n```lua\nfunction init()\n    local program = StandardProgramLoader.load(StandardProgramType.Forward)\n    local scene = app:add_component(SceneAppComponent).scene\n\n    local camEntity = scene:create_entity()\n    local camTrans = camEntity:add_component(Transform, { 0, 1, -1 })\n    camTrans:look_at({ 0, 0, 0 })\n    local cam = camEntity:add_component(Camera)\n    cam:set_perspective(Math.radians(60), 0.3, 1000)\n    cam:add_component(ForwardRenderer)\n    cam:add_component(LightingRenderComponent)\n\n    local lightEntity = scene:create_entity()\n    lightEntity:add_component(AmbientLight, 0.2)\n    lightEntity:add_component(Transform, { 1, 1, -1 })\n    local light = lightEntity:add_component(PointLight, 2)\n    light.range = 5\n\n    local mesh = MeshData.new_sphere():create_mesh(program.vertex_layout)\n    scene:create_entity():add_component(Renderable, mesh, program, Color.green)\nend\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelibero%2Fdarmok","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiguelibero%2Fdarmok","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelibero%2Fdarmok/lists"}