Programming/Dev

[013] Direct2D 렌더링 코드 구조 변경

LaivY 2023. 11. 5. 21:32

DevLog

데이터베이스 DLL을 따로 뺀 것 처럼

데이터 파일 읽는 것도 클라이언트, 서버 모두 사용할 것이므로 DLL로 빼는 작업을 하고 있다.

해당 작업을 하면서 Direct2D 렌더링 할 때 굳이 보여줄 필요 없는 부분은 보여주지 않으려고 한다.

 

 

 

 

 

namespace Renderer2D
{
    ComPtr<ID2D1DeviceContext2> g_ctx{};

    void DrawImage(const std::shared_ptr<Resource::Image>& image, const INT2& position, float opacity)
    {
        Resource::UseAsD2D(g_ctx, image);
        INT2 size{ Resource::GetSize(image) };
        g_ctx->DrawBitmap(
            static_cast<ID2D1Bitmap*>(*image),
            RECTF{ 
                static_cast<float>(position.x), 
                static_cast<float>(position.y),
                static_cast<float>(position.x + size.x),
                static_cast<float>(position.y + size.y) 
            },
            opacity
        );
    }
}

 

Direct2D 관련 변수인 `ComPtr<ID2D1DeviceContext2>` 같은 걸 굳이 Render 함수 파라미터로 넘겨줄 필요가 있나 싶었다.

그래서 Direct2D 관련 변수는 다 이 파일에 모으고 다른 파일에서는 DrawImage와 같은 함수를 통해서 편하게 렌더링 할 수 있게 했다.

 

 

 

 

 

void LoginWnd::Render() const
{
    auto root{ Resource::Get("UI.dat/Login") };
    auto background{ Resource::GetImage(root, "Background") };

    auto patch{ Resource::Get(root, "9Patch") };
    auto lt{ Resource::GetImage(patch, "LT") };
    auto t{ Resource::GetImage(patch, "T") };
    auto rt{ Resource::GetImage(patch, "RT") };
    auto l{ Resource::GetImage(patch, "L") };
    auto r{ Resource::GetImage(patch, "R") };
    auto lb{ Resource::GetImage(patch, "LB") };
    auto b{ Resource::GetImage(patch, "B") };
    auto rb{ Resource::GetImage(patch, "RB") };

    Renderer2D::DrawRect(RECTI{ 0, 0, m_size.x, m_size.y }.Offset(m_position.x, m_position.y));
    Renderer2D::DrawImage(lt, INT2{ 0, 0 } + m_position);
    Renderer2D::DrawImage(t, RECTI{ Resource::GetSize(lt).x, 0, m_size.x - Resource::GetSize(rt).y, Resource::GetSize(t).y }.Offset(m_position.x, m_position.y));
    Renderer2D::DrawImage(rt, INT2{ m_size.x - Resource::GetSize(rt).x } + m_position);
    Renderer2D::DrawImage(l, RECTI{ 0, Resource::GetSize(lt).y, Resource::GetSize(l).x, m_size.y - Resource::GetSize(lb).y }.Offset(m_position.x, m_position.y));
    Renderer2D::DrawImage(r, RECTI{ m_size.x - Resource::GetSize(r).x, Resource::GetSize(rt).y, m_size.x, m_size.y - Resource::GetSize(rb).y }.Offset(m_position.x, m_position.y));
    Renderer2D::DrawImage(lb, INT2{ 0, m_size.y - Resource::GetSize(lb).y } + m_position);
    Renderer2D::DrawImage(b, RECTI{ Resource::GetSize(lb).x, m_size.y - Resource::GetSize(b).y, m_size.x - Resource::GetSize(rb).y, m_size.y }.Offset(m_position.x, m_position.y));
    Renderer2D::DrawImage(rb, INT2{ m_size.x - Resource::GetSize(rb).x, m_size.y - Resource::GetSize(rb).y } + m_position);
}

이제 Render 함수에 파라미터로 ID2D1DeviceContext2를 넘겨주지 않는다.

위 코드는 앞서 말한대로 데이터 파일 읽기를 DLL로 빼고, 윈도우 테두리를 렌더링하는 코드이다.

각 Render 함수에서 Direct2D 함수를 몰라도 렌더링할 수 있게 됐다.

 

 

 

 

위 코드의 결과이다.

윈도우 사이즈에 맞게 테두리를 그린다. 초록색 영역이 윈도우 영역이다.

 

뭔가 요새 코드 구조만 자꾸 바꾸고 진전이 없는 느낌이긴한데,

개인적으로는 코드의 구조가 중요하다고 생각하기 때문에 충분히 이쁜 코드를 작성하고자 한다.