Object Export

버텍스와 삼각형 인덱스 리스트를 출력해보자.

MAX 용어들

Affine Transformation
기하학적 변환 -- 이동, 회전, 스케일링 -- 이것은 점 사이의 거리나 라인 사이의 각도를 수정할 수 있지만, 직선(straight line) 및 평행선(parallel line) 사이의 평행 관계는 유지한다. 3ds 맥스 Transform 연산은 아핀(affine) 변환이다.

Class Descriptor
class descriptor 는 플러그인 클래스에 대한 정보를 제공한다. 이 클래스에서 정의된 메서드는 ClassID, SuperClassID 와 같은 정보에 접근한다.

SuperClassID
최상위 클래스 ID 는 클래스가 표현하는 오브젝트의 유형을 기술하는 시스템 정의 상수이다. 최상위 클래스 ID의 예를 들어 보자 : GEOMOBJECT_CLASS_ID, CAMERA_CLASS_ID, LIGHT_CLASS_ID, SHAPE_CLASS_ID, HELPER_CLASS_ID, SYSTEM_CLASS_ID.

ClassID
플러그인 클래스에 의해 요구되는 단일 식별자(ID)이다. SDK 는 이러한 Class_ID 들을 생성하기 위한 프로그램을 제공한다.

TriObject
삼각형 메시 오브젝트. 모든 절차적 오브젝트들은 반드시 자신을 TriObject 들로 변환할 수 있어야만 한다. TriObjects 는 "변형가능(deformable)"하다. 이것은 그것(TriObject)들이 수정자가 기하도형을 변형하기 위해 연산을 수행할 수 있는 지점을 가진다는 것을 의미한다.

노드 객체의 종류는 노드의 클래스 식별자 SuperClassID, Class_ID로 알수가 있다.
triObjectClassID는 TriObject의 클래스 ID이다.
triObject 클래스인 경우 삼각형 버텍스 정보와 인덱스 정보를 저장 한다.
 

        //1. 오브젝트의 정보를 출력한다.

        void ExportObject(INode* pNode, int iTreeDepth);

        //2. 메쉬를 출력한다.  1번의 ExportObject 내부에서 2번의 ExportObject를 실행한다.

        void ExportObject(TriObject* pTriObj, int iTreeDepth);

 

void maxPluginTest::Export(INode* pNode, int iTreeDepth /* = 0 */)

{

    // First step to export: What are we exporting?

    // Here we are going to export the basic scene tree,

    // identifying each node by name.

 

    MCHAR* pNodeName = pNode->GetName();

    int nChildren = pNode->NumberOfChildren();

 

    // Write out this node as [NodeName] : XX Children

    Write(iTreeDepth, "[%s] : %i children", pNodeName, nChildren);

 

    // Write out this nodes object properties

    ExportObject(pNode, iTreeDepth);

 

    // Recursively call the children

    iTreeDepth++;

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

    {

        Export(pNode->GetChildNode(i), iTreeDepth);

    }

}

 

void maxPluginTest::ExportObject(INode* pNode, int iTreeDepth)

{

    // Get a pointer to this nodes object reference

    Object* pObject = pNode->GetObjectRef();

 

    // the root node for example, doesnt have an object

    if (pObject != NULL)

    {

        SClass_ID lSuperID = pObject->SuperClassID();

        Class_ID lClassID = pObject->ClassID();

 

        // Write out our class types

        // See also SDK documentation for "list of Super Class IDs"

        Write(iTreeDepth, "Obj SuperclassID : %X", lSuperID);

        Write(iTreeDepth, "Obj ClassID : (%X, %X)", lClassID.PartA(), lClassID.PartB());

 

        // Is it possible that we can convert this object to

        // something we understand?  Here we try converting

        // to a TriObject, using its Class_ID

        if (pObject->CanConvertToType(triObjectClassID))

        {

            TriObject* pTriObject = (TriObject*)pObject->ConvertToType(0, triObjectClassID);

            if (pTriObject != NULL)

            {

                // Write out the mesh indented

                ExportObject(pTriObject, iTreeDepth + 1);

 

                // Note that if the TriObject pointer does not

                // point to the the original object, it is a new

                // instance that we are now responsible for

                if (pTriObject != pObject)

                {

                    // Never call delete directly on any max class

                    pTriObject->DeleteMe();

                }

            }

        }

    }

}

 

void maxPluginTest::ExportObject(TriObject* pTriObj, int iTreeDepth)

{

    // See the SDK Documentation for "PG: Working With Meshes"

 

    // Get the data container

    Mesh& lMesh = pTriObj->GetMesh();

 

    // How many vertices?

    int nVerts = lMesh.getNumVerts();

    Write(iTreeDepth, "Number of Vertices: %i", nVerts);

 

    // Write the vertices positions

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

    {

        Point3& vtx = lMesh.getVert(i);

        Write(iTreeDepth, "Vertex[%02i] : (%f,\t%f,\t%f)", i, vtx.x, vtx.y, vtx.z);

    }

 

    // Write out our triangle indices

    int nTris = lMesh.getNumFaces();

    Write(iTreeDepth, "Number of Triangles : %i", nTris);

 

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

    {

        // Mesh has a public property, lFace,

        // that we use to access face data

        Face& lFace = lMesh.faces[i];

        // Retrieves a pointer to the index array

        DWORD* pIndices = lFace.getAllVerts();

 

        Write(iTreeDepth, "Face[%02i], Vertex IDs : (%u, %u, %u)",

                    i, pIndices[0], pIndices[1], pIndices[2]);

    }

}

결과: 메쉬 익스포트

 

참조:

MAX 용어:   http://knight76.tistory.com/category/c++