{"id":21471841,"url":"https://github.com/deccer/enginekit","last_synced_at":"2025-07-15T08:31:35.497Z","repository":{"id":64272921,"uuid":"532293342","full_name":"deccer/EngineKit","owner":"deccer","description":"Abstraction over modern OpenGL","archived":false,"fork":false,"pushed_at":"2024-12-28T04:45:22.000Z","size":306068,"stargazers_count":20,"open_issues_count":8,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-09T00:41:30.688Z","etag":null,"topics":["abstraction-layer","enginekit","graphics-engine","graphics-programming","modern-opengl","opengl","opengl46"],"latest_commit_sha":null,"homepage":"https://discord.gg/VxEaZ3B4Tg","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/deccer.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2022-09-03T15:05:53.000Z","updated_at":"2025-03-26T01:21:03.000Z","dependencies_parsed_at":"2024-12-27T17:30:52.379Z","dependency_job_id":"4d23124b-11b3-41b3-84f3-9aff3e0617f2","html_url":"https://github.com/deccer/EngineKit","commit_stats":{"total_commits":204,"total_committers":2,"mean_commits":102.0,"dds":"0.014705882352941124","last_synced_commit":"8ce382ea2e44c0875bd3cb4c86b7fbd4a90ab8d6"},"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/deccer/EngineKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deccer%2FEngineKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deccer%2FEngineKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deccer%2FEngineKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deccer%2FEngineKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deccer","download_url":"https://codeload.github.com/deccer/EngineKit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deccer%2FEngineKit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265419694,"owners_count":23761858,"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":["abstraction-layer","enginekit","graphics-engine","graphics-programming","modern-opengl","opengl","opengl46"],"created_at":"2024-11-23T09:46:01.404Z","updated_at":"2025-07-15T08:31:31.897Z","avatar_url":"https://github.com/deccer.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EngineKit\n\n[![Discord](https://img.shields.io/discord/846125233807163437?style=plastic\u0026logo=discord\u0026logoColor=orange\u0026label=EngineKit)](https://discord.gg/VxEaZ3B4Tg)\n\nAbstraction over modern OpenGL.\n\nIt tries to hide the ugliness of the global state machine that is OpenGL.\n\n## Getting Started\n\nIt is a little cumbersome, but bare with me.\n\nCreate two projects\n\n- `YourProject` as a console project\n- `YourProject.Assets` as a class library project (your IDE might have created a `Class1.cs` file, you can delete that safely)\n---\n\n- Add `YourProject.Assets` as a project reference to `YourProject`.\n- Copy `Fonts` directory from [here](https://github.com/deccer/EngineKit/tree/main/examples/ForwardRendering/ForwardRendering.Assets) into `YourProject.Assets` (i am working on a neater solution)\n- Add `EngineKit` to `YourProject` via nuget as a usual package.\n- We also need a few other packages:\n  - `Microsoft.Extensions.Configuration` - handle configuration in general \n  - `Microsoft.Extensions.Configuration.Json` - to load appsettings.json\n  - `Microsoft.Extensions.Options.ConfigurationExtensions` - to turn sections of the configuration into usable objects\n  - `Microsoft.Extensions.DependencyInjection` - that's the dependency injection container we use here\n  - `Serilog.Sinks.Console` - to print log statement to the console\n  - `Serilog.Settings.Configuration` - an adapter for serilog to get its configuration from our configuration object\n- Create an `appsettings.json` in `YourProject` which should like like [this](https://github.com/deccer/EngineKit/blob/main/examples/ForwardRendering/ForwardRendering/appsettings.json) one.\n- Make sure to have it copied when its newer by right clicking it -\u003e Properties -\u003e \"Copy to output directory\" -\u003e \"Copy if newer\"\n---\n- Create a class `YourProjectApplication` in `YourProject` and let it derive from `GraphicsApplication` (let your IDE implement the constructor, if you cannot figure it out look at [this constructor for inspiration](https://github.com/deccer/EngineKit/blob/main/examples/ForwardRendering/ForwardRendering/ForwardRendererApplication.cs#L69C26-L69C26))\n- `Program.cs` of `YourProject` should look like\n```cs\nusing EngineKit;\nusing EngineKit.Extensions;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Serilog;\n\nnamespace YourProject;\n\ninternal static class Program\n{\n    public static void Main(string[] args)\n    {\n        using var serviceProvider = CreateServiceProvider();\n\n        var application = serviceProvider.GetRequiredService\u003cIApplication\u003e();\n        application.Run();\n    }\n\n    private static ServiceProvider CreateServiceProvider()\n    {\n        var configuration = new ConfigurationBuilder()\n            .AddJsonFile(\"appsettings.json\", false)\n            .Build();\n\n        Log.Logger = new LoggerConfiguration()\n            .ReadFrom.Configuration(configuration)\n            .CreateLogger();\n\n        var services = new ServiceCollection();\n        services.AddSingleton(configuration);\n        services.AddSingleton(Log.Logger);\n        services.Configure\u003cWindowSettings\u003e(configuration.GetSection(nameof(WindowSettings)));\n        services.Configure\u003cContextSettings\u003e(configuration.GetSection(nameof(ContextSettings)));\n        services.AddEngine();\n        services.AddSingleton\u003cIApplication, XXX\u003e(); // replace XXX with YourProjectApplication \n        return services.BuildServiceProvider();\n    }\n}\n```\n- Run it. \n- You should get a black window which you cannot close :)\n- For that you can implement `YourProjectApplication`'s `Update` method via\n```cs\nprotected override void Update(float deltaTime)\n{\n    base.Update(deltaTime);\n    if (IsKeyPressed(Glfw.Key.KeyEscape))\n    {\n        Close();\n    }\n}\n```\n\nTODO Complex Example","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeccer%2Fenginekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeccer%2Fenginekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeccer%2Fenginekit/lists"}