Окно и движки рендера

GameWindow

Основной класс для работы с окном и управлением рендер-движками.

Регистрация движков

// Регистрируем свой пайплайн
GameWindow.AddRenderEngine("OpenGL", loaders => 
    new OpenGLPipeline(loaders));

GameWindow.AddRenderEngine("Vulkan", loaders => 
    new VulkanPipeline(loaders));

// Список доступных движков
var engines = GameWindow.RenderEngines; // ["OpenGL", "Vulkan", ...]

// Удаление движка
GameWindow.RemoveRenderEngine("OpenGL");

Смена движка во время работы

// Менять движок можно даже после загрузки окна
Igdrasil.Window.Engine = "Vulkan";
// Старый пайплайн будет очищен, новый инициализирован

События окна

// События заложены в GameWindow
Igdrasil.Window.OnLoad += () => 
{
    // вызывается после загрузки пайплайна
};

Igdrasil.Window.OnRender += (context, dt) => 
{
    // вызывается каждый кадр перед SwapBuffers
};

Igdrasil.Window.Update += dt => 
{
    // вызывается для логики (из Igdrasil.OnUpdate)
};

Igdrasil.Window.Closing += () => 
{
    // вызывается при закрытии окна
};

Управление окном

// Запуск основного цикла (блокирует)
Igdrasil.Window.Run();

// Закрытие
Igdrasil.Window.Close();

// Текущий рендер-контекст
var context = Igdrasil.Window.Context; // IRenderContext

// Базовое Silk.NET окно (если нужен низкоуровневый доступ)
var silkWindow = Igdrasil.Window.Window;

WindowOptions

Опции для создания окна и выбора движка рендера.

Готовые пресеты

// OpenGL 1280×720, VSync включен
var opts = WindowOptions.Default;

// Vulkan 1280×720, VSync отключен
var opts = WindowOptions.DefaultVulkan;

Создание с параметрами

var options = new WindowOptions
{
    // Основное
    Title = "My Game",
    Engine = "OpenGL", // какой движок использовать
    Size = new IVector2(1280, 720),
    Position = new IVector2(100, 100),
    
    // Поведение
    IsVisible = true,
    VSync = true,
    IsEventDriven = false, // true = ждёт событий вместо постоянного цикла
    
    // Состояние окна
    WindowState = WindowState.Normal, // Normal, Maximized, Minimized, Fullscreen
    WindowBorder = WindowBorder.Resizable, // Resizable, Fixed, Hidden
    TopMost = false,
    
    // Производительность
    FramesPerSecond = 0.0, // 0 = неограниченно
    UpdatesPerSecond = 0.0,
    
    // Буферы
    PreferredDepthBufferBits = 24,
    PreferredStencilBufferBits = 8,
    Samples = 4, // MSAA
    
    // API
    TransparentFramebuffer = false,
    IsContextControlDisabled = false
};

Igdrasil.InitializeWindow(options);

Инициализация окна

При вызове Igdrasil.InitializeWindow() происходит:

  1. Создание GameWindow с выбранным пайплайном
  2. Вызов OnInit пайплайна (может изменить Silk.NET опции)
  3. Создание Silk.NET окна
  4. Вызов OnLoad пайплайна (загрузка GPU-ресурсов)
  5. Готово к подписке на Igdrasil.OnLoad и запуску Igdrasil.Start()
// Инициализация с опциями
Igdrasil.InitializeWindow(
    options,
    renderThreads: 4,        // для Vulkan/D3D12
    onlyLatestLog: true      // перезаписывать logs/latest.log
);

// Без окна (headless, для тестов)
Igdrasil.InitializeWithoutWindow(onlyLatestLog: true);

Версия: 1.0