XML Exporter: Object

맥스의 오브젝트에서 파생된 Derived ObjectProcedural Object 두 종류가 있다.

Procedural Object: 3DSMAX에서 사용되는 오브젝트로   Gometric Objects:,  Helper Objects, Shape Objects, Lights, Cameras등이 있다.

Derived Object: 상속 클래스는 오브젝트에 대한 포인터를 포함하며,  하나 이상의 modifier 응용프로그램을 포함한다.

루트 노드를 제외한 모든 노드는 오브젝트를 가지고 있다. Export시 사용되는 오브젝트는 Procedural Object이다. Export::CreateXMLObject() 함수에서 INode::GetObjectRef()의 Object가 있으면  SClass_ID에 의해 오브젝트 타입을 알아낸다. 지오메트리 오브젝트는 본과 바이패드가  포함된 오브젝트인지 판단하기 위해 Class_ID로 결정한다.

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

{

    Object* pObject = pNode->GetObjectRef();

    if(pObject == NULL )

        return NULL;

 

    SClass_ID lSuperID = pObject->SuperClassID();

    Class_ID lClassID = pObject->ClassID();

 

    XmlNode* pXmlNode = NULL;

    if(GEOMOBJECT_CLASS_ID == lSuperID)

    {

        if( BONE_OBJ_CLASSID == lClassID || Class_ID(BONE_CLASS_ID, 0) == lClassID)

        {

            pXmlNode = CreateXmlNode( "BONE_OBJ_CLASSID" );

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

        }

        else

        {

            pXmlNode = CreateXmlNode( "GEOMOBJECT_CLASS_ID" );

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

        }

    }

    else if(CAMERA_CLASS_ID == lSuperID)

    {

        pXmlNode = CreateXmlNode( "CAMERA_CLASS_ID" );

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

    }

    else if(LIGHT_CLASS_ID == lSuperID)

    {

        pXmlNode = CreateXmlNode( "LIGHT_CLASS_ID" );

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

    }

    else if(SHAPE_CLASS_ID == lSuperID)

    {

        pXmlNode = CreateXmlNode( "SHAPE_CLASS_ID" );

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

 

    }

    else if(HELPER_CLASS_ID == lSuperID)

    {

        pXmlNode = CreateXmlNode( "HELPER_CLASS_ID" );

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

    }

 

    if( pXmlNode )

        pParentXML->AttachChild( pXmlNode );   

 

    return pXmlNode;

}

 

void Export::CollectINode( INode* pNode, XmlNode* pParentXML )

{

    if(!pNode)

        return;

 

    XmlNode* pXmlNode = CreateXMLObject(pNode, pParentXML );

    if( pXmlNode == NULL )

    {

        pXmlNode = CreateXmlNode( "Node" );

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

        if( m_pXmlRoot == NULL )

            pParentXML = m_pXmlRoot = pXmlNode;

        else

            pParentXML->AttachChild( pXmlNode );

    }

    int iChild = pNode->NumberOfChildren();

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

    {

        INode* pChild = pNode->GetChildNode(i);

 

        if(pChild)

        {

            CollectINode(pChild, pXmlNode );

        }

    }

}

프로젝트: maxProject_object.zip