XML Exporter: Mesh

본이 아닌 정적인 메쉬를 출력한다  왼손 좌표계와 로컬 행렬 적용은 다음장에 구현 한다.
메쉬 출력은 Export::CreateBaseMesh() 메쏘드에서 정점과 정점 인덱스를 저장한다.

메쉬 출력은 다음의 단계로 진행한다.

1. Object::ConvertToType()의 리턴값 TriObject*이 존재 하면 삼각형 메쉬로 익스포트 가능하다.

2. TriObject::GetMesh()의 리턴값 Mesh*이 존재 하면 정점과 정점 인덱스를 구할 수 있다.

3. Object::ConvertToType() 메쏘드에 의해 삼각형 메쉬로 변환한다. 리턴값은 TriObject* 이다.

4. TriObject::GetMesh()로 Mesh*를 구한다.

5. Mesh가 있으면 3DSMAX의 씬구조와는 상관없이 "mesh" 엘리먼트 노드를 추가하여 정점의 정보들을 "mesh" 엘리먼트의 자식 엘리먼트로 추가 할 수 있게 한다.

5. Mesh::getNumVerts()로 정점 갯수를 구해서, 갯수 만큼 리턴값 Point3로 좌표를 구한다.
Point3 Mesh::verts[index]   Point3는 맥스의 3D 정점 클래스이다.

6. Mesh::getNumFaces()로 삼각형 인덱스 3개를 구해서, 갯수 만큼 리턴값 int로 정점의 인덱스를 구한다.
int Mesh::faces[index].v[0]
int Mesh::faces[index].v[1]
int Mesh::faces[index].v[2]

아래 코드는 CreateBaseMesh()의 전체 코드이다.

XmlNode* Export::CreateBaseMesh( INode* pNode, XmlNode* pParentXML )

{

    XmlNode* pXmlNode = CreateXmlNode( "GEOMOBJECT_CLASS_ID" );

    pXmlNode->AddAttribute( "name", pNode->GetName() );

 

    //삼각형 메쉬로 바꿀수 있는가?

    Object* pObject = pNode->GetObjectRef();

    if( pObject->CanConvertToType( Class_ID(TRIOBJ_CLASS_ID, 0)) == 0 )

        return pXmlNode;

 

    //삼각형 메쉬로 변환

    TriObject* pTri = (TriObject *)pObject->ConvertToType(0, Class_ID(TRIOBJ_CLASS_ID, 0));

    if(NULL == pTri)

        return pXmlNode;

 

    //메쉬 객체를 구한다.

    Mesh* pMesh    = &pTri->GetMesh();

    if( pMesh == NULL )

        return pXmlNode;

 

    //메쉬를 위한 노드는 맥스와 상관없이 추가적으로 생성해서 메쉬 데이터를 이 아래로 추가한다.

    char* szObjName = GetPrimitiveName( pObject );

    XmlNode* pXmlMeshNode = CreateXmlNode( "mesh" );

    pXmlMeshNode->AddAttribute( "name",szObjName );

    pXmlNode->AttachChild( pXmlMeshNode );

 

    //정점 데이터

    int    numVertex    = pMesh->getNumVerts();

    XmlNode* pXmlVertexNode = CreateXmlNode( "Vertex" );

    pXmlMeshNode->AttachChild( pXmlVertexNode );

    pXmlVertexNode->AttachChild( CreateXmlNode( "Number" ) )->SetData( ToString( numVertex ) );

    for (int i=0; i < numVertex; ++i)

    {

        Point3 v = pMesh->verts[i];

        base::Vector3 pos( v.x, v.y, v.z );

        pXmlVertexNode->AttachChild( CreateXmlNode( "data" ) )->SetData( ToString(pos) );

    }

 

    //정점 인덱스

    int numFace = pMesh->getNumFaces();

    XmlNode* pXmlFaceNode = CreateXmlNode( "Face" );

    pXmlMeshNode->AttachChild( pXmlFaceNode );

    pXmlFaceNode->AttachChild( CreateXmlNode( "Number" ) )->SetData( ToString( numFace ) );

    for( int i = 0; i < numFace; ++i )

    {

        base::Index3 index;

        index.a = pMesh->faces[i].v[0];

        index.b = pMesh->faces[i].v[1];

        index.c = pMesh->faces[i].v[2];

        pXmlFaceNode->AttachChild( CreateXmlNode( "data" ) )->SetData( ToString(index) );

    }

 

    return pXmlNode;

}

프로젝트: maxProject_mesh.zip