У меня есть 3 проекта:
- GameEngine.Rendering
- Содержит интерфейсы и абстрактные классы для других проектов для реализации и создания уровня абстракции API рендеринга.
- GameEngine.Rendering.OpenGL4
- Реализация интерфейсов в OpenGL 4.0.
- GameEngine.Rendering.Direct3D11
- Реализация интерфейсов Direct3D 11.
Один интерфейс GameEngine.Rendering *Проект 1030 * выглядит следующим образом:
public interface IRenderContext
{
void SwapBuffers();
}
Для реализации OpenGL 4.0 этого интерфейса в качестве параметра требуется интерфейс IWindowInfo
, а для реализации Direct3D 11 - нет. Для реализации Direct3D 11 требуется IntPtr
дескриптор окна.
Я не думал, что это станет большой проблемой, пока не захотел сделать создание контекста рендеринга простым и безболезненным:
var renderContext = CreateRenderContext(DriverType.Direct3D11, windowHandle);
Единственное решение, о котором я думал, было в проекте GameEngine.Rendering для создания такой структуры, которая реализует IWindowInfo
:
public struct RenderContextInfo : IWindowInfo
{
public IntPtr OutputHandle { get; set; }
}
Однако это не такТочно хороший выбор дизайна, так как я бы предпочел, чтобы проект GameEngine.Rendering ничего не знал о каких-либо реализациях.
Мне было просто интересно, каковы мои варианты решения этой проблемы? Есть ли какая-нибудь причудливая уловка, где я могу создать экземпляр IWindowInfo
интерфейса?