読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

描画Frameworkをつくってみた3

前回問題だったGraphicsSelectorクラスのif文を少し改善した。

入手先

GitHub MEGA

課題

まだGraphicsSelectorクラスは改善の余地がある。

現状、描画アーキテクチャや描画内容が増えるたびに、大量のコードを追加せねばならない。 たとえば、OpenGLを追加した場合、以下のようなファイル修正が必要になる。

  • 新規ファイル追加
    • OpenGLWndProc.cpp
    • OpenGLWndProc.h
    • IOpenGLDrawer.cpp
    • IOpenGLDrawer.h
    • OpenGLDrawerScene1.cpp
    • OpenGLDrawerScene1.h
    • OpenGLDrawerScene2.cpp
    • OpenGLDrawerScene2.h
  • 既存ファイル修正
    • GraphicsSelector.cpp
    • GraphicsSelector.h

新規ファイルは内容そのものなので追加するのはかまわない。 でも、それらのファイルをGraphicsSelectorクラスで登録したり初期化したりする処理まで追記せねばならない。 たとえば、OpenGLなどを追加した場合、GraphicsSelectorクラスは以下のようなコード修正が必要になる。

GraphicsSelector.h

private:
    Selector<IOpenGLDrawer*> m_openglSelector;

GraphicsSelector.cpp

Initialize関数

if (!m_openglSelector.IsContain(_T("Scene1"))) {
    m_openglSelector.Add(_T("Scene1"), (IOpenGLDrawer*) new OpenGLDrawerScene1());
}
if (!m_openglSelector.IsContain(_T("Scene2"))) {
    m_openglSelector.Add(_T("Scene2"), (IOpenGLDrawer*) new OpenGLDrawerScene2());
}
m_openglSelector.Select(_T("Scene1"));

if (!m_drawWndProcSelector.IsContain(_T("OpenGL"))) {
    m_drawWndProcSelector.Add(_T("OpenGL"), (IDrawWndProc*) new OpenGLWndProc(&m_openglSelector));
}

Finalize関数

delete m_drawWndProcSelector.Get(_T("OpenGL"));

delete m_openglSelector.Get(_T("Scene1"));
delete m_openglSelector.Get(_T("Scene2"));
m_openglSelector.Clear();

SelectOpenGLDrawer関数

void GraphicsSelector::SelectOpenGLDrawer(const std::basic_string<TCHAR>& key)
{
    if (!m_openglSelector.IsContain(key)) { return; }
    if (m_openglSelector.Get(key) == m_openglSelector.GetSelected()) { return; }
    m_openglSelector.GetSelected()->Finalize();
    m_openglSelector.Select(key);
    m_openglSelector.GetSelected()->Initialize();
}

Select関数

} else if (_T("OpenGL") == wndProcKey) {
    this->SelectDrawWndProc(wndProcKey);
    this->SelectOpenGLDrawer(drawerKey);
}

所感

はっきり言って使えない。 こんなものFrameworkとは言わない。 だからGraphicsSelectorはFramework名前空間には入っていない。

これをもっと改善してFrameworkレベルにしたい。 できることなら、1行も追加することなく、自動で使えるようにしたい。 たとえば今回の例でいえば、OpenGL関係の新規ファイル追加しただけでGraphicsSelector.Select("OpenGL", "Scene1");を使えるようにしたい。

さて、どうしたものか。