EngineKit icon indicating copy to clipboard operation
EngineKit copied to clipboard

Abstraction over modern OpenGL

EngineKit

Discord

Abstraction over modern OpenGL.

It tries to hide the ugliness of the global state machine that is OpenGL.

Getting Started

It is a little cumbersome, but bare with me.

Create two projects

  • YourProject as a console project
  • YourProject.Assets as a class library project (your IDE might have created a Class1.cs file, you can delete that safely)

  • Add YourProject.Assets as a project reference to YourProject.
  • Copy Fonts directory from here into YourProject.Assets (i am working on a neater solution)
  • Add EngineKit to YourProject via nuget as a usual package.
  • We also need a few other packages:
    • Microsoft.Extensions.Configuration - handle configuration in general
    • Microsoft.Extensions.Configuration.Json - to load appsettings.json
    • Microsoft.Extensions.Options.ConfigurationExtensions - to turn sections of the configuration into usable objects
    • Microsoft.Extensions.DependencyInjection - that's the dependency injection container we use here
    • Serilog.Sinks.Console - to print log statement to the console
    • Serilog.Settings.Configuration - an adapter for serilog to get its configuration from our configuration object
  • Create an appsettings.json in YourProject which should like like this one.
  • Make sure to have it copied when its newer by right clicking it -> Properties -> "Copy to output directory" -> "Copy if newer"

  • 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)
  • Program.cs of YourProject should look like
using EngineKit;
using EngineKit.Extensions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Serilog;

namespace YourProject;

internal static class Program
{
    public static void Main(string[] args)
    {
        using var serviceProvider = CreateServiceProvider();

        var application = serviceProvider.GetRequiredService<IApplication>();
        application.Run();
    }

    private static ServiceProvider CreateServiceProvider()
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", false)
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

        var services = new ServiceCollection();
        services.AddSingleton(configuration);
        services.AddSingleton(Log.Logger);
        services.Configure<WindowSettings>(configuration.GetSection(nameof(WindowSettings)));
        services.Configure<ContextSettings>(configuration.GetSection(nameof(ContextSettings)));
        services.AddEngine();
        services.AddSingleton<IApplication, XXX>(); // replace XXX with YourProjectApplication 
        return services.BuildServiceProvider();
    }
}
  • Run it.
  • You should get a black window which you cannot close :)
  • For that you can implement YourProjectApplication's Update method via
protected override void Update(float deltaTime)
{
    base.Update(deltaTime);
    if (IsKeyPressed(Glfw.Key.KeyEscape))
    {
        Close();
    }
}

TODO Complex Example