[GWork] SDL2 샘플이 붉은색 박스로만 렌더링 되는 이슈

GWork 폰트 관련 런타임 이슈까지 해결하고 이제 샘플이 뜨나보다 싶었는데 아래와 같이 제대로 뜨지 않고 컨트롤들이 모두 붉은색으로 떴습니다.


GWork 개발자 블로그를 보면 아래와 같이 떠야하는데 말이죠.


같이 뜨는 콘솔창에도 아무런 메시지가 나오지 않았습니다. 그래서 디버깅에 들어갔죠. 일단 텍스쳐 렌더링 하는 곳을 확인해 봤는데 콜스택은 아래와 같습니다.

> GworkSDL2Sample.exe!Gwk::Renderer::SDL2::DrawTexturedRect(Gwk::Texture * texture, Gwk::Rect rect, float u1, float v1, float u2, float v2) 줄 182 C++
  GworkSDL2Sample.exe!Gwk::Skin::Texturing::Bordered::DrawRect(Gwk::Renderer::Base * render, int i, int x, int y, int w, int h) 줄 169 C++
  GworkSDL2Sample.exe!Gwk::Skin::Texturing::Bordered::Draw(Gwk::Renderer::Base * render, Gwk::Rect r, const Gwk::Color & col, unsigned int draw) 줄 141 C++
  GworkSDL2Sample.exe!Gwk::Skin::TexturedBase::DrawTabControl(Gwk::Controls::Base * control) 줄 609 C++
  GworkSDL2Sample.exe!TabControlInner::Render(Gwk::Skin::Base * skin) 줄 52 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 575 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::Base * skin) 줄 547 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 585 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::Base * skin) 줄 547 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 585 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::Base * skin) 줄 547 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 585 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::Base * skin) 줄 547 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 585 C++
  GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::Base * skin) 줄 547 C++
  GworkSDL2Sample.exe!Gwk::Controls::Canvas::RenderCanvas() 줄 56 C++
  GworkSDL2Sample.exe!SDL_main(int argc, char * * argv) 줄 71 C++
  GworkSDL2Sample.exe!main_utf8(int argc, char * * argv) 줄 126 C
  GworkSDL2Sample.exe!main_getcmdline(...) 줄 159 C
  GworkSDL2Sample.exe!main(int argc, char * * argv) 줄 172 C


최종 적으로 이슈가 생긴곳은 아래와 같습니다. 텍스쳐 데이터가 null 이더군요.

void SDL2::DrawTexturedRect(Gwk::Texture* texture, Gwk::Rect rect,
                            float u1, float v1, float u2, float v2)
{
    SDL_Texture *tex = static_cast<SDL_Texture*>(texture->data);

    if (!tex)
        return DrawMissingImage(rect);


- texture 0x0077c498 {name="DefaultSkin.png" data=0x00000000 failed=true ...} Gwk::Texture *
+ name "DefaultSkin.png" std::basic_string<char,std::char_traits<char>,std::allocator<char> >
data 0x00000000 void *

그래서 최종적으로 DrawMissingImage가 호출되면서 붉은색으로 rect를 그리고 있던것이죠.
void Base::DrawMissingImage(Gwk::Rect targetRect)
{
    SetDrawColor(Colors::Red);
    DrawFilledRect(targetRect);
}


텍스쳐 읽어오는 부분을 확인해봤습니다.

void SDL2::LoadTexture(Gwk::Texture* texture)
{
    if (!texture)
        return;

    if (texture->data)
        FreeTexture(texture);
 
    SDL_Texture *tex = nullptr;
    if (texture->readable)
    {
        // You cannot find the format of a texture once loaded to read from it
        // in SDL2 so we have to keep the surface to read from.
        SDL_Surface *surf = IMG_Load(texture->name.c_str());

+ surf 0x00000000 <NULL> SDL_Surface *

분명 이전 에러에서 작업 디렉토리 설정도 제대로 했는데 왜 텍스쳐를 제대로 못 읽어오나 싶었는데 지난번에 발생한 IMG_Load로 png 파일 제대로 못 읽는 것과 비슷한 이슈더군요. libpng16-16.dll 를 작업디렉토리에 복사해주면 텍스쳐를 제대로 로딩해줍니다.

또는 skin.Init("/gui/DefaultSkin.png"); 이런식으로 하위 폴더가 있을 때 맨 앞에 / 는 빼주고 skin.Init("gui/DefaultSkin.png"); 게 해줘야 스킨 텍스쳐가 로딩이 제대로 됩니다.

그렇지만 색상만 제대로 보일뿐 컨트롤들이 아직 제대로 보이지 않네요. 더 파봐야 할 듯합니다.


이 블로그의 인기 게시물

CMake Windows에 설치하기

Unity3D iOS Plugin 만들어 연동하기

Unity3D 안드로이드 Keystore 생성하기