보통 게임을 할 때 총이나 활, 방패, 모자, 지팡이와 같은 아이템들을 캐릭터가 들고다니는데, 토크에서는 이런 것들을 ShapeBaseImageData 라 해서 플레이어 바디에 마운트를 시킬 수 있다. 머리면 머리, 손이면 손, 팔, 다리, 배 등등 사용자가 원하는 위치에 마운트를 하게되는데 기본적으로 ShapeBaseImageData 를 플레이어에 마운트하는 방법은 두가지다.
정확히는, 방법이 두가지라기보다 상황이 두 가지인데 첫 번째로는 GUI, 즉 실제 게임으로 들어가기 전 캐릭터를 선택하고 아이템을 고를 때 이다. 당연히 GuiObjectView 를 사용한다.
GuiObjectView 에
%obj.setModel(data); 로 캐릭터를 띄우고
%obj.setMount(data, mountPoint); 로 해당 아이템을 마운트 시킨다.
두번째는 실제 게임으로 들어갈 때, 앞에서 설정한 아이템을 마운트시키는 경우다.
Player data를 생성한 후
%player.mountImage(%mountImage, mountPoint); 로 마운트 시킨다.
이 때, 둘 중 어느 상황이 됬든 아이템을 마운트시켜도 캐릭터에 붙어다니지 않는 버그가 있었다. 다시 말하면 아이템에 마운트 된 후 캐릭터의 반응에도 불구하고 석고상 마냥 전혀 움직이지 않는 것 이다. GuiObjectView 의 상단에 마운트되어 캐릭터가 움직여도 캐릭터 따로, 아이템 따로 노는 상황인데 예를들어, 손에 총을 들고있다하면 걷거나 뛰거나 넘어질 때 캐릭터 손의 위치가 바껴도 총은 어느 특정위치에 고정되어서 움직이지 않는 상황이다. 신기하게도 토크엔진에서 기본적으로 제공하는 오크캐릭터는 그렇지 않더라는 것. 분명히 우리쪽에서 작업한 데이터에 문제가 있거나 잘못된 코딩 탓 일텐데 1년이상 찾지못했다. 아니, 1년 이상 방치해뒀었다 =_=.. 더 큰 문제들이 훨씬 더 많았기 때문에.
저번 주에 나름 여유가 생겨서(당시 새벽 1시 ;;) 팀장님과 잠시 찾아볼 기회가 있었는데 우연찮게 해결책을 찾았다.
아래는 Torque ShowTool 이라는 프로그램이다. 토크에서 기본으로 제공하는 오크캐릭터를 로딩해서 오브젝트를 마운트 시키기 직전 이미지 인데 자세히 보면 DTS에 Mount0, Mount1, Mount2 라는 마운트포인트가 설정되어있다. 저것이 문제였던 것.
setMount 나 mountImage 할 때 mountPoint 를 정수로 받아서 엔진쪽으로 넘기게 되는데, 넘겨받은 정수를 "mount" + '숫자'로 DTS 에 마운트포인트가 물려있는지 찾아서 있다면 그 곳에 붙이는 거다.
하지만 우리가 만든 캐릭터에는 따로 설정해둔 마운트포인트가 없었기 때문에 마운트는 되지만 엉뚱한곳에 달려서전혀 움직이지 않았던거다.

아래는 엔진 소스코드
void GuiObjectView::setMountedObject(const char * modelName, S32 mountPoint){SAFE_DELETE(mMountedModel);// create a weapon for this dudeResource<TSShape> model = ResourceManager->load(modelName);if (! bool(model)){//Con::warnf(avar("GuiObjectView: Failed to load mounted object model %s. Please check your model name and load a valid model.", modelName));return;}char * mountName = new char[16];dStrncpy(mountName, avar("mount%d", 0), 15);mMountNode = mModel->getShape()->findNode(mountName);delete [] mountName;mMountedModel = new TSShapeInstance(model, true);AssertFatal(mMountedModel, avar("GuiObjectView: Failed to load mounted object model %s. Please check your model name and load a valid model.", modelName));}
사실 가이드 책을 조금만 더 자세히 봤더라면 고민하지않고도 간단히 찾을 수 있었을 텐데, 미리 찾아보지 않은 점이 아쉽다.