UI 기획이 확 바뀌어 UI 리뉴얼에 들어갔습니다. 모가 바꼈을 까요~? 기획서를 봤습니다. 헛 흠 ..... Scaleform 홈페이지나 Scaleform 홍보 동영상에서 보았던 3D UI가 저희 프로젝트 기획서에 딱하니 있습니다. 네..ㅜ.ㅜ 3D UI를 하자는 거죠..

그래서 현재 사용하고 있는 Gamebryo 2.6 - Scaleform 3.1 버전을 3.2로 업그레이드 해야하는 작업이 생겼습니다. 예전에 3.0에서 3.1로 업그레이드할때 쫌 약간의 문제가 있었는데.. 이번에도 잘 될까 하고~ 두려움을 앉고 업그레이드 작업에 돌입했습니다. 참고로 Gamebryo 엔진용 Scaleform integration 배포판은 LightSpeed - 3.1 Integration 만 있습니다. 전 이걸 Gamebryo 2.6 버젼으로 수정하여 사용하고 있습니다. (네.. 수정할 것이 좀 있습니다.) 아무튼~! Integration 작업에 돌입하였습니다. 사용하고있는 3.1 Include 파일, 라이브러리, 소스, 서드파티 등을 다 지우고 3.2 버젼 으로 업그레이드 했습니다.

Gamebryo 엔진 Scaleform Integration인 NiGFx를 빌드를 했는데 ~ 엇 예상했던 거와 반대로 빌드가 깔끔하게 되었습니다. 기억으로는 3.0에서 3.1로 업그레이드할 때 약간 수정을 했던걸로 알고 있었는데 3.1에서 3.2로 업그레이드에선 인터페이스가 하나도 안바뀐 모양입니다. (이때까지 행복했습니다.) 그래서 테스트 겸 클라이언트를 실행했습니다. 헛 ㅜ.ㅜ 바로 죽어버리네요... 디버그로 찾아봤는데 .... 헛 GFx 내부 GRendererD3DxImpl -> PopRenderTarget에서 죽어버리네요.. 이유가 RenderTarget에 대한 정보를 스택에 넣는데 RenderTarget이 초기화가 안된 상태에서 스택에 들어가서 문제였습니다. 열심히 해결책을 찾고자 Scaleform 포럼에 들어갔습니다.
찾아 본 결과~ 나와 같은 경우를 겪은 사람들이 두명 밖에 없더군요. 그나마 다행입니다. 이런 문제점이 있어 글을 남겨서.. ^-^  글을 읽은 결과~! 딱 한마디로 써놨습니다. "너가 아마도 SetDisplayRenderTarget 함수를 호출하지 않았을꺼다. SetDisplayRenderTarget 놈을 호출해라~!" 라고 Scaleform 답변이 있었습니다. 언제? 어디서? 저놈을 해줘야 하는지가 없네요..ㅠ.ㅠ 이것까지 친절하게 알려주지..
[죽는 이유가 무비파일에서 어떠한 필터를 쓰거나 AS에서 필터 관련을 썼을 경우 GFx에서 내부 플래시 필터 Update시에 현재 RenderTarget을 스택에 push하고 렌더링때 pop을 해서 RenderTarget을 가져오는데 push할때 현재 RenderTarget이 아무것도 없이 초기화가 안된상태에서 push를 해서 생기는 문제였습니다.]

그래서 열심히 어디다 넣을까를 찾아봤습니다. NiGFx에서는 Scaleform의 GRenderer를 생성을 NiGFxRendererPair에서 따로 생성해서 사용하고 있었습니다. 그래서 해결책은~! NiGFxRendererPair에서 Initialize에서 SetDisplayRenderTarget를 해주면 됩니다.
[참고하세요~]
GRenderTargetD3D9::D3D9RenderTargetParams RTParams;
pkDevice->GetRenderTarget(0, &RTParams.pRenderSurface);
pkDevice->GetDepthStencilSurface(&RTParams.pStencilSurface);

m_spScreenRenderTarget = *m_spTheGRenderer->CreateRenderTarget();
((GRenderTargetD3D9*)m_spScreenRenderTarget.GetPtr())->InitRenderTarget(RTParams);
m_spTheGRenderer->SetDisplayRenderTarget(m_spScreenRenderTarget);

RTParams.pRenderSurface->Release();
RTParams.pStencilSurface->Release();

요렇게 해주시면 됩니다.

,