XML Exporter: Material Export

¸Æ½º¿¡¼­ ÀçÁú°ú ´ÙÀÌ·ºÆ® XÀÇ ÀçÁúÀÇ °³³äÀº ´Ù¸£´Ù. ¸Æ½º¿¡¼­ ÀçÁúÀº ÇϳªÀÇ ¸Þ½¬´ç ¿©·¯°³ÀÇ ÀçÁúÀ» °¡Áú¼ö ÀÖ´Ù. DX¿¡¼­´Â ÀçÁú°ú ÅؽºÃÄ°¡ ºÐ¸® µÇ¾î ÀÖÁö¸¸ ¸Æ½º¿¡¼­´Â ÀçÁú¿¡ ÅؽºÃÄ°¡ Æ÷ÇÔ µÈ´Ù.

¸Æ½ºÀÇ ÀçÁúÀ» °ÔÀÓ¿¡¼­ ±×´ë·Î ±¸ÇöÇß´Ù°£ Ç÷¾Ð »ó½Â°ú °ÔÀÓ ÃÖÀûÈ­¸¦ °¨´çÇÒ ¼ö ¾ø±â ¶§¹®¿¡ µðÇ»Áî ¸Ê¸¸ ÀͽºÆ÷Æ® Çϵµ·Ï ÇÑ´Ù.

½ÇÇà ¼ø¼­:  BuildMaterial() --> CollectMaterial() --> WriteMaterial()
°£´ÜÇÏ°Ô ¿ä¾àÇÏ¸é ´ÙÀ½°ú °°´Ù.

Export ¸ÞÀÎÇÔ¼ö¿¡¼­ ºÎ¸£´Â ÇÔ¼ö·Î XmlExp¸¦ ÀڽıîÁö Àç±Í È£Ãâ ÇÑ´Ù.

m_pINode->GetMtl() ¸ÞÆ®¸®¾óÀÌ ÀÖÀ¸¸é CollectMaterial()À» ½ÇÇàÇÑ´Ù.

void XmlExp::BuildMaterial()

 

pMtl->NumSubTexmaps() ¸ÞÆ®¸®¾óÀÇ ¼­ºê ÅؽºÃÄ°¡ ÀÖ°í µðÇ»Áî ¸ÊÀ̸é WriteMaterial()À» ½ÇÇà

void XmlExp::CollectMaterial( INode* pNode, Mtl* pMtl )

 

µðÇ»Áî ¸Ê(ID_DI)À̸é ÅؽºÃÄ À̸§°ú ÀçÁúÀ» ÀúÀå

void XmlExp::WriteMaterial( Mtl* pMtl, Texmap* texMap, int nSubID )

 

BuildMaterial

INode::GetMtl() : ¸ÞÆ®¸®¾ó(Mtl)À» ¸®ÅÏÇÑ´Ù.

void XmlExp::BuildMaterial()

{

    if( m_pINode )

    {

        Mtl* pMtl = m_pINode->GetMtl();

        CollectMaterial( m_pINode, pMtl );

    }

 

    .......

    Àç±Í È£Ãâ: BuildMaterial()

}

 

CollectMaterial

Mtl::NumSubTexmaps() : ÅؽºÃÄÀÇ °¹¼ö¸¦ ±¸ÇÑ´Ù.
Mtl::GetSubTexmap() : TexmapÀ» ¸®ÅÏÇÑ´Ù.
Mtl::NumSubMtls() : ¼­ºê ÀçÁúÀÇ °¹¼ö¸¦ ±¸ÇÑ´Ù.
Mtl::GetSubMtl() : ¼­ºê ÀçÁú MtlÀ» ¸®ÅÏÇÑ´Ù.

¸Æ½º¿¡¼­ ÀçÁúÀº INode ó·³ Æ®¸®±¸Á¶·Î µÇ¾î ÀÖ´Ù. ±×·¡¼­ GetSubMtl()·Î °è¼Ó ¼øȸÇϸ鼭 µðÇ»Áî ¸ÊÀ» °Ë»öÇÑ´Ù.

void XmlExp::CollectMaterial( INode* pNode, Mtl* pMtl )

{

    if( pMtl == NULL )

        return;

 

    int nSub = pMtl->NumSubTexmaps();

 

    for( int n=0; n<nSub; ++n )

    {

        Texmap* subTexMap = pMtl->GetSubTexmap(n);

        if( subTexMap == NULL )

            continue;

 

        WriteMaterial( pMtl, subTexMap, n );

    }

 

    int iSub = pMtl->NumSubMtls();

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

    {

        Mtl* pSubMtl = pMtl->GetSubMtl(i);

        CollectMaterial( m_pINode, pSubMtl );

    }           

}

 

WriteMaterial

ÅؽºÃĸÊÀÇ ID°¡ Class_ID(BMTEX_CLASS_ID, 0x0)À̸é À̹ÌÁö ÆÄÀÏÀÌ´Ù.
SubTexmapÀÇ ID°¡ ID_DIÀÌ¸é µðÇ»Áî ¸ÊÀ¸·Î À̶§ ÅؽºÃÄ À̸§°ú ÀçÁúÀÇ Ambient, Diffuse, Specular °ªÀ» ÀúÀåÇÑ´Ù.

void XmlExp::WriteMaterial( Mtl* pMtl, Texmap* texMap, int nSubID )

{

    if (texMap->ClassID() == Class_ID(BMTEX_CLASS_ID, 0x0))

    {

        //°æ·Î¸¦ Æ÷ÇÔÇÑ °æ·Î

        TSTR bitmapFile = ((BitmapTex *)texMap)->GetMapName();

        if( bitmapFile.data() && strlen(bitmapFile) > 3 )

        {

            TSTR className;

            texMap->GetClassName(className);

 

            TSTR fileName;

            SplitPathFile(bitmapFile, NULL, &fileName);

 

            if(ID_DI == nSubID)    // diffuse Map

            {

                XmlExp* meshXmlExp = (XmlExp*)this->FindFirstChild( "mesh" );

                if( meshXmlExp )

                {

                    //ÅؽºÃÄ À̸§ ÀúÀå, bitmapFileÀ̳ª fileNameÀ» ÀúÀå

                    Color c = pMtl->GetAmbient();

                    c = pMtl->GetDiffuse(); 

                    c = pMtl->GetSpecular();

                    ........

                }

            }

        }

    }

}

 

ÇÁ·ÎÁ§Æ® : maxProject_material.zip